Szukałem prostego wyrażenia regularnego dla adresów URL, czy ktoś ma przydatne, które działa dobrze? Nie znalazłem takiego z klasami walidacji frameworka zend i widziałem kilka implementacji.
php
regex
url
validation
AndreLiem
źródło
źródło
Odpowiedzi:
Użyłem tego w kilku projektach, nie sądzę, że napotkałem problemy, ale jestem pewien, że nie jest to wyczerpujące:
Większość przypadkowych śmieci na końcu dotyczy sytuacji takich jak
http://domain.com.
w zdaniu (aby uniknąć dopasowania kropki na końcu). Jestem pewien, że można to wyczyścić, ale ponieważ zadziałało. Po prostu skopiowałem to z projektu do projektu.źródło
google.com
jest tylko prawidłową względną ścieżką adresu URL, ale nie jest prawidłowym bezwzględnym adresem URL. Myślę, że właśnie tego szuka.http://example.com/somedir/...
jest całkowicie uzasadnionym adresem URL, proszącym o plik o nazwie...
- która jest prawidłową nazwą pliku.http://www.example
Użyj
filter_var()
funkcji, aby sprawdzić, czy ciąg jest adresem URL, czy nie:Używanie wyrażeń regularnych, gdy nie jest to konieczne, jest złą praktyką.
EDYCJA : Uważaj, to rozwiązanie nie jest bezpieczne dla Unicode ani XSS. Jeśli potrzebujesz złożonej weryfikacji, może lepiej poszukać gdzie indziej.
źródło
http://www
Zgodnie z instrukcją PHP - parse_url nie powinno być używane do sprawdzania poprawności adresu URL.
Niestety wydaje się, że
filter_var('example.com', FILTER_VALIDATE_URL)
nie działa lepiej.Zarówno, jak
parse_url()
ifilter_var()
będą przekazywać źle sformułowane adresy URL, takie jakhttp://...
Dlatego w tym przypadku - regex jest lepszą metodą.
źródło
Na wypadek gdybyś chciał wiedzieć, czy adres URL naprawdę istnieje:
źródło
$url
przed faktyczną weryfikacją, czy adres URL jest prawdziwy, ponieważ powyższa operacja jest kosztowna - może nawet 200 milisekund w zależności od rozmiaru pliku. W niektórych przypadkach adres URL może w rzeczywistości nie mieć jeszcze dostępnego zasobu w swojej lokalizacji (np. Tworzenie adresu URL do obrazu, który jeszcze nie został przesłany). Ponadto nie używasz wersji z pamięci podręcznej, więc nie jest tak,file_exists()
że buforuje statystyki w pliku i zwraca je prawie natychmiast. Rozwiązanie, które podałeś, jest jednak nadal przydatne. Dlaczego po prostu nie użyćfopen($url, 'r')
?Według Johna Grubera (Daring Fireball):
Regex:
używanie w preg_match ():
Oto rozszerzony wzorzec wyrażenia regularnego (z komentarzami):
Więcej informacji można znaleźć pod adresem : http://daringfireball.net/2010/07/improved_regex_for_matching_urls
źródło
Nie sądzę, aby w tym przypadku używanie wyrażeń regularnych było mądrą rzeczą. Niemożliwe jest dopasowanie wszystkich możliwości, a nawet gdyby tak było, nadal istnieje szansa, że adres URL po prostu nie istnieje.
Oto bardzo prosty sposób sprawdzenia, czy adres URL rzeczywiście istnieje i czy można go odczytać:
(jeśli nie ma,
preg_match
to również zweryfikowałoby wszystkie nazwy plików na twoim serwerze)źródło
Użyłem tego z dobrym skutkiem - nie pamiętam, skąd go wziąłem
źródło
źródło
A oto twoja odpowiedź =) Spróbuj ją złamać, nie możesz !!!
źródło
Edycja:
Jak wskazywały przypadki , ten kod został WYCOFANY z wydaniem PHP 5.3.0 (2009-06-30) i powinien być odpowiednio używany.
Tylko moje dwa centy, ale opracowałem tę funkcję i używam jej z powodzeniem od jakiegoś czasu. Jest dobrze udokumentowany i oddzielony, dzięki czemu można go łatwo zmienić.
źródło
źródło
Zainspirowany tym pytaniem .NET StackOverflow iw tym przywoływanym artykule z tego pytania jest ten walidator URI (URI oznacza, że sprawdza zarówno adres URL, jak i URN).
Pomyślnie przetestowałem tę funkcję w obiekcie ValueObject, który utworzyłem
Uri
i przetestowałem przezUriTest
.UriTest.php (zawiera prawidłowe i nieprawidłowe przypadki zarówno dla adresów URL, jak i URN)
Uri.php (obiekt wartości)
Uruchamianie testów jednostkowych
W 46 testach jest 65 twierdzeń. Uwaga: istnieją 2 dostawcy danych dla prawidłowych i 2 kolejnych dla nieprawidłowych wyrażeń. Jedna dotyczy adresów URL, a druga adresów URN. Jeśli używasz wersji PhpUnit v5.6 * lub starszej, musisz połączyć dwóch dostawców danych w jednego.
Pokrycie kodu
Ten przykładowy moduł sprawdzania identyfikatorów URI obejmuje 100% pokrycia kodu.
źródło
(http (s?): //) oznacza http: // lub https: //
([a-z0-9 -] +.) + => 2,0 [a-z0-9-] oznacza dowolny znak z lub dowolny znak 0-9 lub (-))
"/(http(s?)://)([a-z0-9-]+.)+[az]{2,4}(.[az]{2,4}) (/ [^] + ) / i ”
Uwaga: przepraszam za zły angielski. Mój kraj nie używa go dobrze.
źródło
OK, więc jest to trochę bardziej złożone niż proste wyrażenie regularne, ale dopuszcza różne typy adresów URL.
Przykłady:
Wszystko, co powinno być oznaczone jako ważne.
Zauważ, że istnieje kontrola in_array dla protokołów, które chcesz zezwolić (obecnie na tej liście znajdują się tylko http i https).
źródło
Najlepszy URL Regex, który działał dla mnie:
Przykłady:
Źródło: http://urlregex.com/
źródło
Peter's Regex nie wygląda dla mnie dobrze z wielu powodów. Dopuszcza wszystkie rodzaje znaków specjalnych w nazwie domeny i nie testuje zbyt wiele.
Dla mnie funkcja Frankiego wygląda dobrze i możesz zbudować dobry regex z komponentów, jeśli nie chcesz funkcji, na przykład:
Niesprawdzone, ale myślę, że to powinno działać.
Również odpowiedź Owena nie wygląda na 100%. Wziąłem część domeny z wyrażenia regularnego i przetestowałem ją na narzędziu do testowania Regex http://erik.eae.net/playground/regexp/regexp.html
Postawiłem następującą linię:
w sekcji „regexp” i w następującym wierszu:
w sekcji „przykładowy tekst”.
Wynik pozwolił na przejście znaku minus. Ponieważ \ S oznacza dowolny znak niebędący spacją.
Zwróć uwagę, że wyrażenie regularne od Frankie obsługuje minus, ponieważ ma tę część dla pierwszego znaku:
Co nie pozwoli na minus ani żaden inny znak specjalny.
źródło
Oto sposób, w jaki to zrobiłem. Ale chcę wspomnieć, że nie jestem taki pewien wyrażenia regularnego. Ale to powinno zadziałać :)
W ten sposób nie będziesz potrzebować markera eval na swoim wzorze.
Mam nadzieję, że to pomoże :)
źródło
Oto prosta klasa do sprawdzania poprawności adresu URL przy użyciu wyrażenia RegEx, a następnie odwołań do domeny z popularnymi serwerami RBL (Realtime Blackhole Lists):
Zainstalować:
Stosowanie:
Dodaj adres URL jako parametr
domain()
metody i sprawdź wynik.Wynik:
Jak widać powyżej, www.bokranzr.com jest wymieniony jako złośliwa witryna za pośrednictwem listy RBL, więc domena została zwrócona jako fałszywa.
źródło
Dla każdego, kto tworzy z WordPress, po prostu użyj
aby zweryfikować adres URL ( tutaj jest dokumentacja WordPressa
esc_url_raw
). Obsługuje adresy URL znacznie lepiej niżfilter_var($url, FILTER_VALIDATE_URL)
dlatego, że jest bezpieczny dla formatu Unicode i XSS. ( Tutaj jest dobry artykuł wspominający o wszystkich problemach zfilter_var
).źródło
Uważam, że jest to najbardziej przydatne przy dopasowywaniu adresu URL.
źródło
ftp:
?Jest do tego natywna funkcja PHP:
Zwraca przefiltrowane dane lub FALSE, jeśli filtr się nie powiedzie.
Sprawdź tutaj
źródło