![]() |
![]() |
![]()
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%) ![]() ![]() |
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? |
|
|
![]() ![]() |
![]() |
Aktualny czas: 14.10.2025 - 02:33 |