8

过滤器似乎在FILTER_VALIDATE_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 没有正确验证?什么是可能的解决方法?运行 PHP 5.3.0。

我也想知道在哪里可以找到FILTER_VALIDATE_URL验证过滤器的源代码。

4

3 回答 3

41

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

于 2010-03-31T23:50:27.670 回答
10

以下代码使用 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";
}
于 2017-05-02T19:49:47.897 回答
4

解析从这里开始:
http ://svn.php.net/viewvc/php/php-src/trunk/ext/filter/logical_filters.c?view=markup

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

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

于 2010-01-26T02:36:19.410 回答