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