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过滤器,它将正常工作.过滤器仅根据规范验证,它不会尝试为您修复/编码字符.
以下代码使用 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)
解析从这里开始:
http://svn.php.net/viewvc/php/php-src/trunk/ext/filter/逻辑_filters.c?view=markup
实际上是在 /trunk/ext/standard/url.c 中完成的
乍一看,我看不到任何故意拒绝非 ASCII 字符的内容,因此可能只是缺乏 unicode 支持。PHP 在任何地方都不能很好地处理非 ASCII 字符。:(
| 归档时间: |
|
| 查看次数: |
7758 次 |
| 最近记录: |