2012-03-21 5 views

Odpowiedz

22

To nie jest prawidłowy URL. Przedrostkowanie rzeczy za pomocą http:// nigdy nie było bardzo przyjazne dla użytkownika, więc nowoczesne przeglądarki zakładają, że masz na myśli http, jeśli po prostu wpisujesz nazwę domeny. Biblioteki oprogramowania są, słusznie, trochę bardziej wybredne!

Jedną z metod, którą można zastosować, jest przeciągnięcie ciągu znaków przez parse_url, a następnie dodanie brakujących elementów, np.

if ($parts = parse_url($url)) { 
    if (!isset($parts["scheme"])) 
    { 
     $url = "http://$url"; 
    } 
} 

Co ciekawe, podczas korzystania FILTER_VALIDATE_URL, to faktycznie korzysta parse_url wewnętrznie, aby dowiedzieć się, co program jest (view source). Dzięki salathe za zauważenie tego w komentarzach poniżej.

+0

Dzięki za wyjaśnienie! Użyję metody 'parse_url', o której mówisz, podoba mi się lepiej niż' filter_var' – federicot

+3

Środa Ciekawostki: 'FILTER_VALIDATE_URL' używa' parse_url() ', aby sprawdzić, czy istnieje schemat. – salathe

+0

Nice! Dodam to do odpowiedzi! –

3

Adres URL musi odpowiadać zasadom podanym w RFC 2396 i zgodnie z tą specyfikacją wymagany jest protokół.

1

Część schematu ("protokół") jest wymagana dla FILTER_VALIDATE_URL.

3

Oprócz odpowiedzi Paula Dixona, chcę powiedzieć, że można użyć flags dla FILTER_VALIDATE_URL, aby określić, która część adresu URL musi zostać przedstawiona.

FILTER_FLAG_SCHEME_REQUIRED 
FILTER_FLAG_HOST_REQUIRED 
FILTER_FLAG_PATH_REQUIRED 
FILTER_FLAG_QUERY_REQUIRED 

od PHP 5.2.1 i FILTER_FLAG_HOST_REQUIREDFILTER_FLAG_SCHEME_REQUIRED flagi stosowane domyślnie i, niestety, nie ma sposobu, aby je wyłączyć (ty nie zrobić coś filter_var($url, FILTER_VALIDATE_URL, ~FILTER_FLAG_SCHEME_REQUIRED); jeśli istnienie części schematu URL robi niekoniecznie). Wygląda to jak błąd dla mnie. Istnieje krewny bugreport.

+0

Chciałbym, żeby to zadziałało, ale nie mogę go dostać. –

+1

Wygląda na to, że nie sprawdza poprawności adresów URL. https://3v4l.org/1TjA5 – Derokorian

+0

@RussellSilva, Derokorian Masz rację, nie mogę sprawić, żeby działało. Wygląda jak błąd dla mnie. Zaktualizowałem swoją odpowiedź. –

Powiązane problemy