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

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

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

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

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

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

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

В дополнение к ответу Пола Диксона я хочу сказать, что вы можете использовать флаги для 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 не обязательно). Это кажется ошибкой для меня. Существует относительная ошибка .

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