FILTER_VALIDATE_URL太严格了吗?

时间:2012-03-21 07:44:37

标签: php url

在PHP中,filter_var('www.example.com', FILTER_VALIDATE_URL)返回false。它是否正确?不是www.example.com是有效的URL,还是协议(http://,ftp://等)需要在URL中明确说明才能正式正确?

4 个答案:

答案 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_REQUIREDFILTER_FLAG_HOST_REQUIRED标记,但遗憾的是,无法禁用它们(您可以 执行某些操作像filter_var($url, FILTER_VALIDATE_URL, ~FILTER_FLAG_SCHEME_REQUIRED);,如果URL方案部分的存在不一定)。对我来说这似乎是个错误。有一个亲戚bugreport

答案 3 :(得分:1)

FILTER_VALIDATE_URL需要方案(“协议”)部分。