filter_var对于URL不正确

时间:2013-04-30 07:19:07

标签: php regex url

我正在尝试使用filter_var来验证用户输入的URL,但似乎并不适用于所有情况。我已经要求修复此some time ago on PHP.net,但无济于事。

除了正则表达式(是的,还有一些已经发布在stackoverflow上),有没有可以运行的PHP版本或任何其他方法?

我面临的问题是以下字符串得到了验证,不应该:

http://http://www.google.com

测试脚本:

$url = $_REQUEST['url'];

if (filter_var("http://" . $url, FILTER_VALIDATE_URL)) 

   $filter="true"; 

else 

   $filter="false";

echo "Filter var result of concat with http is:" . $filter . "<br>";

预期结果:

当我使用http://www.google.com运行脚本时,我希望它返回false,当我使用www.google.com运行它时,它会返回true

实际结果:

在两种情况下都返回true

2 个答案:

答案 0 :(得分:0)

如果你报告的错误是什么,filter_var()通过解析它parse_url()并检查结果数组是否合理来验证一个url。

因此,将它粘合在一起,如果你想要更严格的东西,确认它们是平等的。

这是一个合理的glue_url函数:

http://doc.habariproject.org/inputfilter_8php_source.html#l00324

然后:

$valid_url = ($url == glue_url(parse_url($url)));

如果没有提供协议,也可以选中"http://$url"

答案 1 :(得分:0)

我有一个小类我用于更严格的URL验证。不妨把它放到公共领域:

https://github.com/franksrevenge/StrictUrlValidator

它依赖于一些逻辑测试,然后通过测试给定的主机名是否存在,甚至通过查询服务器获取URL的状态代码来变得越来越具有侵入性。当然,远程查询的行为是可配置的。