PHP过滤器FILTER_VALIDATE_URL的限制
我之前已经讨论过PHP5中可用的过滤器功能,但是当我对这些文章进行研究时却未能发现这一限制。看来,用于验证URL字符串(即FILTER_VALIDATE_URL)的过滤器确实不足以完成任务。
在if语句中使用以下过滤器示例。
if ( filter_var($url,FILTER_VALIDATE_URL) ) { return true; }else{ return false; };
如果URL有效,则返回true;如果URL无效,则返回false。为了对此进行测试,我将以下URL字符串插入到函数中并记录了每个结果。
$url = 'http://www.bbc.co.uk'; // true $url = 'http://www.hashbangcode.com'; // true $url = 'http://.com'; // true $url = 'http://...'; // true $url = 'http://'; // false $url = 'http://i\'me really trying to break this url!!!"£$"%$&*()'; // false
如您所见,尽管实际上只有前两个有效,但我尝试使用此功能的大多数URL都有效。该过滤器似乎在做的只是对parse_url()函数运行字符串,然后检测是否生成了数组。这显然不够好。
我目前只能建议您回到使用正则表达式来测试URL的有效性。我通过快速搜索URL从正则表达式库中挑选了一个。
^(http\:\/\/[a-zA-Z0-9_\-]+(?:\.[a-zA-Z0-9_\-]+)*\.[a-zA-Z]{2,4}(?:\/[a-zA-Z0-9_]+)*(?:\/[a-zA-Z0-9_]+\.[a-zA-Z]{2,4}(?:\?[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)?)?(?:\&[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)*)$