Подтвердить что ты не робот

Является ли FILTER_VALIDATE_URL слишком строгим?

В PHP filter_var('www.example.com', FILTER_VALIDATE_URL) возвращает false. Это верно? Является ли www.example.com допустимым URL-адресом, или протоколы (http://, ftp://и т.д.) Должны быть явно указаны в URL-адресе, чтобы они были формально правильными?

4b9b3361

Ответ 1

Недействительный URL. Префикс вещей с http:// никогда не был очень удобной для пользователя, поэтому современные браузеры предполагают, что вы имеете в виду http, если вы просто вводите имя домена. Библиотеки программного обеспечения, по праву, немного более придирчивы!

Один подход, который вы можете предпринять, - передать строку через parse_url, а затем добавить любые отсутствующие элементы, например

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

Интересно, что когда вы используете FILTER_VALIDATE_URL, он фактически использует parse_url внутри, чтобы выяснить, что схема (источник просмотра). Спасибо salathe за обнаружение этого в комментариях ниже.

Ответ 2

URL-адрес должен соответствовать правилам, указанным в RFC 2396, и согласно этой спецификации необходим протокол.

Ответ 3

В дополнение к ответу Пола Диксона я хочу сказать, что вы можете использовать flags для FILTER_VALIDATE_URL, чтобы указать, какая часть URL должен быть представлен.

FILTER_FLAG_SCHEME_REQUIRED
FILTER_FLAG_HOST_REQUIRED
FILTER_FLAG_PATH_REQUIRED
FILTER_FLAG_QUERY_REQUIRED

Поскольку флагов PHP 5.2.1 FILTER_FLAG_SCHEME_REQUIRED и FILTER_FLAG_HOST_REQUIRED используются по умолчанию и, к сожалению, нет способа их отключить (вы не можете делать что-то вроде filter_var($url, FILTER_VALIDATE_URL, ~FILTER_FLAG_SCHEME_REQUIRED);, если существование части схемы URL не обязательно). Это кажется ошибкой для меня. Существует относительный bugreport.

Ответ 4

Часть схемы ( "протокол" ) требуется для FILTER_VALIDATE_URL.