Jak mogę sprawdzić, czy dany ciąg jest prawidłowym adresem URL?
Moja wiedza na temat wyrażeń regularnych jest podstawowa i nie pozwala mi wybierać spośród setek wyrażeń regularnych, które widziałem już w Internecie.
regex
url
language-agnostic
Vitor Silva
źródło
źródło
Odpowiedzi:
Napisałem swój wzorzec adresu URL (właściwie IRI, internacjonalizacja), aby zachować zgodność z RFC 3987 ( http://www.faqs.org/rfcs/rfc3987.html ). Są w składni PCRE.
W przypadku bezwzględnych IRI (internacjonalizowane):
Aby zezwolić także na względne IRI:
Jak zostały skompilowane (w PHP):
Edytuj 7 marca 2011: Ze względu na sposób, w jaki PHP obsługuje ukośniki odwrotne w cytowanych ciągach, domyślnie nie można ich używać. Będziesz musiał podwójnie uciec z ukośnikami odwrotnymi, chyba że ukośnik ma specjalne znaczenie w wyrażeniach regularnych. Możesz to zrobić w ten sposób:
źródło
http://com
to prawidłowy adres URL.http://localhost
dlaczego inne słowa nie byłyby takie? Masz rację, żeu
modyfikator jest niezbędny w PHP. Chcę jasno powiedzieć, że chociaż generowałem je za pomocą PHP, nie mają one być specyficzne dla PHP.Właśnie napisałem wpis na blogu, który jest doskonałym rozwiązaniem do rozpoznawania adresów URL w najczęściej używanych formatach, takich jak:
www.google.com
http://www.google.com
mailto:[email protected]
[email protected]
www.url-with-querystring.com/?url=has-querystring
Użyte wyrażenie regularne to:
źródło
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/
width:210px;
imargin:3px
Jaka platforma? Jeśli używasz platformy .NET, użyj
System.Uri.TryCreate
, a nie wyrażenie regularne.Na przykład:
(Dzięki @Yoshi za wskazówkę na temat
javascript:
)źródło
javascript: alert('blah')
. Musisz przeprowadzić dalszą weryfikację na Uri.Scheme, aby potwierdzić, że używany jest protokół http / https / ftp, w przeciwnym razie, jeśli taki adres URL zostanie wstawiony do kodu HTML stron ASP.NET jako odsyłacz, użytkownicy będą narażeni na ataki XSS .Uri.IsWellFormedUriString()
Oto, czego używa RegexBuddy .
Pasuje do nich poniżej (wewnątrz
** **
znaków):RegexBuddy można pobrać ze strony http://www.regexbuddy.com/download.html .
źródło
/\b(https?|ftp|file):\/\/[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]/
W odniesieniu do postu z odpowiedzią na powieki , który brzmi: „To jest oparte na moim czytaniu specyfikacji URI.”: Dzięki Powieki, twoje jest idealnym rozwiązaniem, którego szukałem, ponieważ jest oparte na specyfikacji URI! Doskonała praca. :)
Musiałem wprowadzić dwie poprawki. Pierwszy, aby uzyskać wyrażenie regularne w celu dopasowania adresów URL adresów IP w PHP (v5.2.10) z funkcją preg_match ().
Musiałem dodać jeszcze jeden zestaw nawiasów do linii nad „adresem IP” wokół rur:
Nie pewny dlaczego.
Zmniejszyłem również minimalną długość domeny najwyższego poziomu z 3 do 2 liter, aby obsługiwać .co.uk i podobne.
Ostateczny kod:
Ta zmodyfikowana wersja nie została sprawdzona pod kątem specyfikacji URI, więc nie mogę ręczyć za jej zgodność, została zmieniona, aby obsługiwać adresy URL w lokalnych sieciach sieciowych i dwucyfrowych TLD, a także inne rodzaje adresów URL w sieci Web, i aby działała lepiej w PHP konfiguracji używam.
Jako kod PHP :
Oto program testowy w PHP, który sprawdza różnorodność adresów URL za pomocą wyrażenia regularnego:
Jeszcze raz dziękuję powiekom za wyrażenie regularne!
źródło
')((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
z')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
„. Dokonałem odpowiedniej zmiany na podstawie tego komentarza./^(https?|ftp):
(protokół) Dlaczego nie zezwala się na protokoły takie jak dane, pliki, svn, dc ++, magnes, skype lub inne obsługiwane przez przeglądarkę z odpowiednią wtyczką lub serwerem?Mathias Bynens ma świetny artykuł na temat najlepszego porównania wielu wyrażeń regularnych: w poszukiwaniu idealnego wyrażenia regularnego sprawdzania poprawności adresu URL
Najlepszy opublikowany jest trochę długi, ale pasuje do wszystkiego, co można w niego rzucić.
Wersja JavaScript
Wersja PHP
źródło
%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu
W artykule Pobieranie części adresu URL (Regex) omówiono analizowanie adresu URL w celu zidentyfikowania jego różnych składników. Jeśli chcesz sprawdzić, czy adres URL jest poprawnie sformułowany, powinien wystarczyć dla twoich potrzeb.
Jeśli musisz sprawdzić, czy jest rzeczywiście ważny, w końcu będziesz musiał uzyskać dostęp do wszystkiego, co jest na drugim końcu.
Zasadniczo jednak lepiej byłoby użyć funkcji dostarczonej przez środowisko lub inną bibliotekę. Wiele platform zawiera funkcje analizujące adresy URL. Na przykład istnieje moduł urlparse Pythona , a w .NET można użyć konstruktora klasy System.Uri jako metody sprawdzania poprawności adresu URL.
źródło
Może to nie być praca dla wyrażeń regularnych, ale dla istniejących narzędzi w wybranym języku. Prawdopodobnie chcesz użyć istniejącego kodu, który został już napisany, przetestowany i debugowany.
W PHP użyj
parse_url
funkcji.Perl:
URI
moduł .Ruby:
URI
moduł ..NET: klasa „Uri”
Regeksy nie są magiczną różdżką, którą machasz przy każdym problemie związanym z łańcuchami.
źródło
java.net.URL
.Nie sprawdzający poprawności parser referencji URI
Dla celów odniesienia oto specyfikacja IETF: ( TXT | HTML ). W szczególności dodatek B. Analiza składni odwołania URI za pomocą wyrażenia regularnego pokazuje, jak parsować poprawne wyrażenie regularne . Jest to opisane jako
Oto regex, który zapewniają:
Jak ktoś inny powiedział, prawdopodobnie najlepiej pozostawić to lib / framework, którego już używasz.
źródło
Spowoduje to dopasowanie wszystkich adresów URL
... w tym subdomeny i nowe rozszerzenia nazw domen najwyższego poziomu, takie jak. muzeum ,. akademia ,. fundacja itd., które mogą mieć maksymalnie 63 znaków (nie tylko. com ,. netto ,. informacji itd.)
Ponieważ obecnie maksymalna długość dostępnego rozszerzenia nazwy domeny najwyższego poziomu wynosi 13 znaków, takich jak. międzynarodowe , możesz zmienić liczbę 63 na 13, aby zapobiec niewłaściwemu użyciu.
jako javascript
Artykuł w Wikipedii: Lista wszystkich internetowych domen najwyższego poziomu
źródło
t.co
. Jak dostosowałbyś go do obsługi tych przypadków?Dla mnie najlepszym wyrażeniem regularnym dla adresu URL byłoby:
źródło
(([\\w]+:)?//)?(([\\d\\w]|%[a-fA-f\\d]{2,2})+(:([\\d\\w]|%[a-fA-f\\d]{2,2})+)?@)?([\\d\\w][-\\d\\w]{0,253}[\\d\\w]\\.)+[\\w]{2,4}(:[\\d]+)?(/([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)*(\\?(&?([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})=?)*)?(#([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)?
\w
z\p{L}
minimum.([\d\w][-\d\w]{0,253}[\d\w]\.)+
na([\d\w][-\d\w]{0,253}[\d\w]?\.)+
(dodać znak zapytania na końcu)Dopasowuje http://site.com/dir/file.php?var=moo | ftp: // użytkownik: [email protected]: 21 / file / reż
Niedopasowane site.com | http://site.com/dir//
źródło
http://www.goo gle.com
będzie pasować.Mecze http://www.asdah.com/~joe | ftp://ftp.asdah.co.uk:2828/asdah%20asdah.gif | https://asdah.gov/asdh-ah.as
źródło
Nie mogłem znaleźć wyrażenia regularnego, którego szukałem, więc zmodyfikowałem wyrażenie regularne, aby spełnić moje wymagania, i wygląda na to, że teraz działa dobrze. Moje wymagania to:
Oto, co wymyśliłem, każda sugestia jest doceniana:
źródło
Jeśli naprawdę szukasz najlepszego dopasowania, prawdopodobnie znajdziesz je w „ A Good Url Regular Expression? ”.
Ale regex, który naprawdę pasuje do wszystkich możliwych domen i pozwala na wszystko, co jest dozwolone zgodnie z RFC, jest strasznie długi i nieczytelny, zaufaj mi ;-)
źródło
Pracowałem nad szczegółowym artykułem omawiającym sprawdzanie poprawności URI przy użyciu wyrażeń regularnych. Opiera się na RFC3986.
Sprawdzanie poprawności identyfikatora URI wyrażenia regularnego
Chociaż artykuł nie jest jeszcze kompletny, wymyśliłem funkcję PHP, która całkiem nieźle sprawdza poprawność adresów URL HTTP i FTP. Oto aktualna wersja:
Ta funkcja wykorzystuje dwa wyrażenia regularne; jeden, aby dopasować podzbiór prawidłowych ogólnych identyfikatorów URI (absolutne z niepustym hostem), a drugi, aby zweryfikować nazwę hosta DNS „części oddzielone kropkami”. Chociaż ta funkcja obecnie sprawdza tylko schematy HTTP i FTP, jest tak skonstruowana, że można ją łatwo rozszerzyć o obsługę innych schematów.
źródło
napisałem trochę świetną wersję, którą można uruchomić
pasuje do następujących adresów URL (co jest dla mnie wystarczająco dobre)
http://google.com
http://google.com/help.php
http://google.com/help.php?a=5
http://www.google.pl
http://www.google.com/help.php
http://www.google.com?a=5
google.com?a=5
google.com/help.php
google.com/help.php?a=5
http://www.m.google.com/help.php?a=5 (i wszystkie jego permutacje)
www.m.google.com/help.php?a=5 (i wszystkie jego permutacje)
m.google.com/help.php?a=5 (i wszystkie jego permutacje)
Ważną rzeczą w przypadku adresów URL, które nie zaczynają się od http lub www, jest to, że muszą zawierać / lub?
Założę się, że można to nieco poprawić, ale robi to całkiem fajnie, ponieważ jest tak krótki i zwarty ... ponieważ można go podzielić na 3:
znajdź wszystko, co zaczyna się od http: https?: // w {0,3} \ w *?. \ w {2,3} \ S *
znajdź wszystko, co zaczyna się od www: www. \ w *?. \ w {2,3} \ S *
lub znaleźć coś, co musi zawierać tekst, a następnie kropkę, a następnie co najmniej 2 litery, a następnie? lub /: \ w *?. \ w {2,3} [/ \?] \ S *
źródło
-
w adresie URL.Używam tego wyrażenia regularnego:
Aby obsłużyć oba:
I:
źródło
((https?:)?(\/?\/))(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
((?:https?:)?(?:\/?\/))((?:[\d\w]|%[a-fA-f\d]{2,2})+(?::(?:[\d\w]|%[a-fA-f\d]{2,2})+)?@)?((?:[\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63})(:[\d]+)?(\/(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(?:&?(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
Oto dobra zasada, która obejmuje wszystkie możliwe przypadki: porty, parametry itp
źródło
Ten działa dla mnie bardzo dobrze.
(https?|ftp)://(www\d?|[a-zA-Z0-9]+)?\.[a-zA-Z0-9-]+(\:|\.)([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?
źródło
Oto gotowa wersja Java z kodu źródłowego Androida. To jest najlepszy, jaki znalazłem.
źródło
Oto regex, który wykonałem, który wyodrębnia różne części z adresu URL:
^((?:https?|ftp):\/\/?)?([^:/\s.]+\.[^:/\s]|localhost)(:\d+)?((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?([^#]+)?(#[\w-]+)?$
((?:https?|ftp):\/\/?)?
(grupa 1) : wyodrębnia protokół([^:/\s.]+\.[^:/\s]|localhost)
(grupa 2) : wyodrębnia nazwę hosta(:\d+)?
(grupa 3) : wyodrębnia numer portu((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?
(grupy 4 i 5) : wyodrębnia część ścieżki([^#]+)?
(grupa 6) : wyodrębnia część zapytania(#[\w-]+)?
(grupa 7) : wyodrębnia część skrótuDla każdej części wyrażenia regularnego wymienionego powyżej możesz usunąć zakończenie,
?
aby go wymusić (lub dodać, aby było fakultatywne). Możesz także usunąć^
na początku i$
na końcu wyrażenia regularnego, aby nie trzeba było dopasowywać całego ciągu.Zobacz na regex101 .
Uwaga: to wyrażenie regularne nie jest w 100% bezpieczne i może akceptować niektóre ciągi znaków, które niekoniecznie są poprawnymi adresami URL, ale w rzeczywistości sprawdza poprawność niektórych kryteriów. Jego głównym celem było wyodrębnienie różnych części adresu URL, aby go nie zweryfikować.
źródło
W przypadku Pythona jest to rzeczywiste wyrażenie sprawdzające poprawność adresu URL używane w Django 1.5.1:
Robi to zarówno adresy ipv4 i ipv6, jak i parametry portów i GET.
Znaleziono w kodzie tutaj , wiersz 44.
źródło
Znalazłem następujący Regex dla adresów URL, przetestowany z ponad 500 adresami URL :
/\b(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\b/gi
Wiem, że wygląda brzydko, ale dobrą rzeczą jest to, że działa. :)
Wyjaśnienie i prezentacja z 581 losowymi adresami URL na regex101.
Źródło: W poszukiwaniu idealnego wyrażenia regularnego sprawdzania poprawności adresu URL
źródło
/(https?):\/\/([\w-]+(\.[\\w-]+)*\.([a-z]+))(([\w.,@?^=%&:\/~+#()!-]*)([\w@?^=%&\/~+#()!-]))?/gi
Próbowałem sformułować moją wersję adresu URL. Moim wymaganiem było przechwytywanie instancji w ciągu znaków, gdzie to możliwe, że URL może być cse.uom.ac.mu - zauważając, że nie jest poprzedzony http ani www
źródło
ht{2}ps?
zamiast tego naprawdę używaciehttps?
co jest nie tak z prostym i prostym FILTER_VALIDATE_URL?
Wiem, że nie jest to dokładnie pytanie, ale zadziałało dla mnie, gdy potrzebowałem zweryfikować adresy URL, więc pomyślałem, że może być użyteczny dla innych osób, które natrafią na ten post i szukają tego samego
źródło
Działa następujący RegEx:
źródło
Użyj tego, który działa dla mnie
źródło
Dla wygody jest to wyrażenie liniowe dla URL-i, które będzie również pasować do localhost, gdzie istnieje większe prawdopodobieństwo, że masz porty niż
.com
lub podobne.źródło
Nie określasz, jakiego języka używasz. Jeśli PHP jest, istnieje natywna funkcja:
Zwraca przefiltrowane dane lub FALSE, jeśli filtr zawiedzie.
Sprawdź tutaj >>
Mam nadzieję, że to pomoże.
źródło