【问题标题】:PHP filter_var() - FILTER_VALIDATE_URLPHP filter_var() - FILTER_VALIDATE_URL
【发布时间】:2011-01-09 08:58:36
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以找到源代码以及 PHP 的其他源代码。它可以在他们网站的下载部分免费获得。至于你的问题,这听起来像是一个错误,你应该报告它。我可以建议的唯一解决方法是使用一些其他逻辑(也许制作一个函数来与 FILTER_CALLBACK 一起使用)。

标签: php validation utf-8 filter filter-var


【解决方案1】:

以下代码使用 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";
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      解析从这里开始:
      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 字符。 :(

      【讨论】:

      • 嗯...if (!isalnum((int)*(unsigned char *)s) &amp;&amp; *s != '_' &amp;&amp; *s != '.')这一定是原因,你能想到什么解决方法吗?
      • @Alix - 正如 zneak 所说,您可以使用 FILTER_CALLBACK 编写自己的过滤器函数。实际上,只需将 C 函数复制并粘贴到 php 脚本中,然后用更宽松的函数替换 isalnum 即可。 (它需要对指针进行一些调整,但我猜不会太多。)
      猜你喜欢
      • 2019-04-19
      • 1970-01-01
      • 2022-10-13
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多