在PHP中,filter_var('www.example.com', FILTER_VALIDATE_URL)
返回false
。它是否正确?不是www.example.com
是有效的URL,还是协议(http://,ftp://等)需要在URL中明确说明才能正式正确?
答案 0 :(得分:24)
这不是有效的网址。使用http://
对事物进行前缀从来都不是一个非常用户友好的事情,因此如果您只输入域名,现代浏览器会认为您的意思是http。正确地说,软件库有点挑剔!
您可以采取的一种方法是将字符串传递给parse_url,然后添加任何缺失的元素,例如。
if ( $parts = parse_url($url) ) {
if ( !isset($parts["scheme"]) )
{
$url = "http://$url";
}
}
有趣的是,当您使用FILTER_VALIDATE_URL时,它实际上在内部使用parse_url来确定方案是什么(view source)。感谢salathe在下面的评论中发现这一点。
答案 1 :(得分:3)
网址必须与RFC 2396中设置的规则相对应,并且根据该规范,协议是必要的。
答案 2 :(得分:3)
除了Paul Dixon的回答,我想说你可以使用flags FILTER_VALIDATE_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。
答案 3 :(得分:1)
FILTER_VALIDATE_URL
需要方案(“协议”)部分。