Bir URL doğrulama için PHP regex

4 Cevap php

I'm looking for a decent regex to match a URL (a full URL with scheme, domain, path etc.) I would normally use filter_var but I can't in this case as I have to support PHP<5.2!

Ben web arandı ama hamlede olacak eminim ki bir şey bulamıyor, ve ben bulabileceğiniz tüm SO filter_var kullanmak söyleyerek kişidir.

Herkes bunun için kullanabileceğiniz bir regex var mı?

Benim kod (sadece bu yüzden ben başarmak için çalışıyorum görebilirsiniz):

function validate_url($url){
    if (function_exists('filter_var')){
        return filter_var($url, FILTER_VALIDATE_URL);
        }
    return preg_match(REGEX_HERE, $url);
    }

4 Cevap

Eğer deneyebilirsiniz this one. Ben kendim denemedim ama haha, kesinlikle şimdiye kadar gördüğüm en büyük sıradanifade bulunuyor.

^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$

Ben alanı doğrulamak için bir çözüm yarattık. Bu özellikle tüm URL kapsamaz iken, çok detaylı ve özeldir. Eğer kendinize sormanız gereken soru "Neden bir etki doğrularken ben?" Olduğunu Bu etki aslında var olmadığını görmek için ise, o zaman (geçerli TLD'lere dahil) alanı onaylamanız gerekir. Sorun çok geliştiricileri ([az] {2,4}) kısayolunu almak ve iyi diyoruz, olduğunu. Eğer bu doğrultuda düşünüyorsanız, o zaman neden URL doğrulama diyoruz? Bu değil. Bu sadece bir regex ile URL geçiyor.

Ben TLD yönetimi (iana.org) için tek bir kaynak kullanarak etki alanını sadece doğrulamak sağlayacak bir açık kaynak kodlu sınıf var, ama aynı zamanda emin aslında var olmak için DNS kayıtları yoluyla etki doğrular. DNS Pasif isteğe bağlıdır, ancak etki TLD dayalı özel geçerli olacak.

For example: example.ay is NOT a valid domain as the .ay TLD is invalid. But using the regex posted here ([a-z]{2,4}), it would pass. I have an affinity for quality. I try to express that in the code I write. Others may not really care. So if you want to simply "check" the URL, you can use the examples listed in these responses. If you actually want to validate the domain in the URL, you can have at the class I created to do just that. It can be downloaded at: http://code.google.com/p/blogchuck/source/browse/trunk/domains.php

It validates based on the RFCs that "govern" (using the term loosely) what determines a valid domain. In a nutshell, here is what the domains class will do: Basic rules of the domain validation

  • uzunluğunda en az bir karakter olmalı
  • bir rakam veya harfle başlamalıdır
  • harf, rakam ve tire içerir
  • Bir harf veya rakamla bitmeli
  • birden çok düğüm içerebilir (yani node1.node2.node3)
  • Her düğüm yalnızca 63 karakter uzunluğunda max olabilir
  • toplam alan adı yalnızca 255 karakter uzunluğunda max olabilir
  • Geçerli bir TLD bitmeli
  • Bir IP4 adresi olabilir

Ayrıca sadece yerel kopyasını kontrol ettikten sonra iana.org ana TLD dosyasının bir kopyasını indirir. Yerel kopyası 30 gün ile eskimiş ise, yeni bir kopyasını indirecektir. Dosyasında TLD'lerin size doğrulayarak olan etki TLD doğrulamak için Regex kullanılacaktır. Bu doğrulamayı geçmesini. AY (ve diğer geçersiz TLD'leri) önler.

Bu kod bir uzun biraz, ama çok kompakt ne yaptığını düşünüyor. Ve bu en doğrusudur. Ben daha önce bir soru sordu bu yüzden. Eğer "doğrulama" ya da basit "denetimi" yapmak ister misiniz?

Ben aslında geçerli bir URL her türlü doğrulamak olabilecek bir regex gördüm ama iki sayfa uzunluğunda ...

Muhtemelen parse_url ile url ayrıştırma ve daha sonra gerekli tüm bitlerin sırasına göre olmadığını kontrol daha iyidir.

Addition: This is a snip of my URL class:

public static function IsUrl($test)
{
    if (strpos($test, ' ') > -1)
    {
        return false;
    }
    if (strpos($test, '.') > 1)
    {
        $check = @parse_url($test);
        return is_array($check)
            && isset($check['scheme'])
            && isset($check['host']) && count(explode('.', $check['host'])) > 1
}
    return false;
}

Bu verilen dize testleri ve url bazı temel gerektirir, düzeni ayarlanır yani o ve host içinde bir nokta vardır.

!(https?://)?([-_a-z0-9]+\.)*([-_a-z0-9]+)\.([a-z]{2,4})(/?)(.*)!i

URL'leri doğrulama için bu normal bir ifade kullanabilirsiniz. Şimdiye kadar bana tek bir kez başarısız değildi :)