PHP filter\u var()-filter\u VALIDATE\u URL

PHP filter\u var()-filter\u VALIDATE\u URL,php,validation,utf-8,filter,filter-var,Php,Validation,Utf 8,Filter,Filter Var,过滤器\u验证\u URL过滤器在验证非ASCII URL时似乎遇到一些问题: var_dump(filter_var('http://pt.wikipedia.org/wiki/', FILTER_VALIDATE_URL)); // http://pt.wikipedia.org/wiki/ var_dump(filter_var('http://pt.wikipedia.org/wiki/Guimarães', FILTER_VALIDATE_URL)); // false 为什么最后一

过滤器\u验证\u URL
过滤器在验证非ASCII URL时似乎遇到一些问题:

var_dump(filter_var('http://pt.wikipedia.org/wiki/', FILTER_VALIDATE_URL)); // http://pt.wikipedia.org/wiki/
var_dump(filter_var('http://pt.wikipedia.org/wiki/Guimarães', FILTER_VALIDATE_URL)); // false
为什么最后一个URL没有正确验证?可能的解决办法是什么?运行PHP5.3.0


我还想知道在哪里可以找到
过滤器\u验证\u URL
验证过滤器的源代码。

解析从这里开始:

实际上是在/trunk/ext/standard/url.c中完成的


乍一看,我看不到任何故意拒绝非ASCII字符的东西,所以可能只是缺少unicode支持。PHP在任何地方处理非ASCII字符都不好:(

根据RFC 1738第5节,从技术上讲,这不是有效的URL。在将请求发送到服务器之前,浏览器将自动将ã字符编码为%C3%A3。此处的技术上有效的完整URL为:
将其传递给VALIDATE_URL筛选器,它将正常工作。该筛选器仅根据规范进行验证,它不会尝试为您修复/编码字符。

以下代码使用filter_var,但在调用它之前对非ascii字符进行编码。希望这对其他人有所帮助

<?php

function validate_url($url) {
    $path = parse_url($url, PHP_URL_PATH);
    $encoded_path = array_map('urlencode', explode('/', $path));
    $url = str_replace($path, implode('/', $encoded_path), $url);

    return filter_var($url, FILTER_VALIDATE_URL) ? true : false;
}

// example
if(!validate_url("http://somedomain.com/some/path/file1.jpg")) {
    echo "NOT A URL";
}
else {
    echo "IS A URL";
}

您可以找到源代码以及PHP的其他源代码。可以在他们网站的下载部分免费获得。就您的问题而言,这听起来像是一个bug,您应该报告它。我建议的唯一解决方法是使用一些其他逻辑(可能在此期间制作一个与FILTER_回调一起使用的函数).Humm…
如果(!isalnum((int)*(unsigned char*)s)和&*s!='''.'和&*s!='.)
这一定是原因,你能想到什么解决办法?@Alix-正如zneak所说,你可以使用FILTER\u CALLBACK编写你自己的过滤函数。实际上,只需将C函数复制粘贴到php脚本中,并用一个更宽松的函数替换isalnum就可以了。(需要对指针进行一些调整,但我想不会太多。)