Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Walidacja URL - najlepszy sposób?
tomilipin
post
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:
  1. '%^(?:(?: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'

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.
http://www.kbrg
(z kropką i bez kropki na końcu)

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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
tomilipin
post
Post #2





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 28.01.2004
Skąd: że znowu ლ(ಠ益ಠლ

Ostrzeżenie: (0%)
-----


Cześć,
znowu zacząłem grzebać w tym kodzie (IMG:style_emoticons/default/smile.gif)

Kilka osób sugerowało sprawdzanie poprawności samej domeny (TLD) - taki sposób odpada, gdyż nie przepuści adresów typu http://142.42.1.1 czy http://例子.测试
Wyrażenie regularne autorstwa @diegoperini, wspomniane wcześniej, nie jest idealne, gdyż nie sprawdza poprawności podanych domen i przepuszcza adresy typu http://asd.aaaaaaaaaaaaa
Innym pomysłem było użycie filter_var i parse_url - patrz pierwszy post i zapoznaj się z opisem tych funkcji w manualu.
Żeby sprawdzić czy "host jest sensowną domeną/IP-kiem" i tak trzeba użyć wyrażeń regularnych, nie widzę więc sensu dodatkowego użycia innych funkcji, skoro można to załatwić jedną linijką kodu.

YourFrog, myślę, że masz dużo racji. Idąc Twoim tokiem myślenia, poczyniłem już pewne kroki. Nie są mi potrzebne chińskie krzaki w nazwach TLD, więc pozbyłem się tej funkjonalności. Adresy, które będę walidował to strony producentów żywności, a nie sądzę, żeby którykolwiek reklamował się pod adresem IP, zatem nie jest mi potrzebna walidacja IPków (jednak zostwiłem ją na wszelki wypadek). Chcę mieć istniejącą domenę na końcu, więc dodałem listę akceptowanych przeze mnie nazw TLD. Nie pinguję serwera, bo w przypadku chwilowego braku odpowiedzi mój kod odrzuciłby poprawny adres. Oczywiście nie chcę, żeby linki prowadziły do 404, więc dopiero po walidacji całego adresu można sobie to sprawdzić.

Doszedłem więc do takiego regexpa:
Kod
_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|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]{2}|com|org|net|inne_domeny_tutaj_wpisz)))(?::\d{2,5})?(?:/\S*)?$_iuS


ten rzeczywiście nie jest idealny, bo nie akceptuje poprawnych domen zapisanych chińskimi czy arabskimi krzakami, ale odpowiada moim potrzebom.

Co sądzicie?
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.10.2025 - 02:33