![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 70 Pomógł: 0 Dołączył: 28.01.2004 Skąd: że znowu ლ(ಠ益ಠლ Ostrzeżenie: (0%) ![]() ![]() |
Cześć,
poszukuję najlepszego sposobu na walidację adresów stron w skrypcie PHP. Robię klasę więc wersja obiektowa będzie mile widziana. Próbowałem już funkcji parse_url oraz filter_var - niestety, obie przepuszczają niepoprawne adresy (pomijając fakt, że parse_url nie służy do walidacji). Chciałbym się więc skierować w stronę wyrażeń regularnych, ale w wielu przypadkach użytkownicy to odradzają. Dlaczego? Znalazłem takie wyrażenie regularne:
z jednej strony jest okropnie długie i jego wykonanie może być zasochłonne, ale z drugiej strony - nie przepuści żadnego błędnego URLa. Jeśli mogę to samo uzyskać krótszym i prostszym kodem, to chętnie skorzystam, tylko błagam... nie odsyłajcie do szukajek - większość linków (nawet do Zenda w innym temacie na forum) jest już nieaktualnych, albo proponują tam rozwiązanie przepuszczające np. http://www.. (dwie kropki na końcu) Na dłuższy czas porzuciłem tę kwestię, ale znowu muszę się nią zająć... Nadal poszukuję niezawodnego sposobu parsowania URLi. Wyrażenie, które podałem w powyższym poście przepuszcza adresy typu: Kod http://www.kbrg. (z kropką i bez kropki na końcu)http://www.kbrg Próbowałem też regexpy ze strony http://mathiasbynens.be/demo/url-regex ale nie potrafię dostosować ich do PHP - ciągle wywala mi jakiś błąd (IMG:style_emoticons/default/sad.gif) Jakieś pomysły? Ten post edytował tomilipin 31.08.2013, 15:30:58 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 70 Pomógł: 0 Dołączył: 28.01.2004 Skąd: że znowu ლ(ಠ益ಠლ Ostrzeżenie: (0%) ![]() ![]() |
Hmm... tak myślę nad tym, co napisał Crozin i dochodzę do wniosku, że faktycznie to może być problem. No bo jeśli strona padnie, ale jej adres jest poprawny, to niestety funkcja timona zwróci FALSE.
Co do filter_var - zastosowałem to tak: Kod var_dump(filter_var($url, FILTER_VALIDATE_URL)); i oto co otrzymałem... Kod string(13) "htp://www.k.." Wszędzie powinno być FALSEstring(17) "http://3628126748" string(16) "http://224.1.1.1" string(17) "http://a.b--c.de/" Natomiast filter_var odrzuca adresy, w których znajdują się znaki Unicode, np. http://www.broń.pl nie mówiąc już o czymś tak egzotycznym jak http://✪df.ws/123 pod którym kryje się działająca strona, ale nawet forumowy parser nie podołał wykryć w tym przypadku linka. Ale nie poddaję się - szukam dalej rozwiązania (IMG:style_emoticons/default/smile.gif) -- edit -- Zrobiłem (IMG:style_emoticons/default/smile.gif) Oto regexp, który perfekcyjnie filtruje URL: Kod %^(?:(?: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 Do użytku z preg_match Pozdrawiam i dziękuję za pomoc (IMG:style_emoticons/default/smile.gif) Ten post edytował tomilipin 17.03.2014, 17:43:44 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Oto regexp, który perfekcyjnie filtruje URL Pierwszy z brzegu kontrprzykład: http://test.aaaaaaaaaaaaaaa Ja kiedyś zrobiłem wyrażenie regularne z listą wszystkich dostępnych [edit] Zresztą można to przyspieszyć rozbijając na kilka akcji, np. najpierw jakiś strpos z listą domen, a później zawężanie wyniku przez regexp (IMG:style_emoticons/default/smile.gif) Ten post edytował sowiq 17.03.2014, 20:03:35 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 9.10.2025 - 02:26 |