В 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
.