PHP filter_var() - FILTER_VALIDATE_URL

Ali*_*xel 6 php validation utf-8 filter filter-var

FILTER_VALIDATE_URL过滤器似乎有一些无法验证非ASCII网址:

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
Run Code Online (Sandbox Code Playgroud)

为什么没有正确验证最后一个URL?什么是可能的解决方法?运行PHP 5.3.0.

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

小智 39

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


Hue*_* Ly 9

以下代码使用 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";
}
Run Code Online (Sandbox Code Playgroud)


lyl*_*yle 4

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

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

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