我正在尝试使用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
答案 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的状态代码来变得越来越具有侵入性。当然,远程查询的行为是可配置的。