为什么FILTER_VALIDATE_URL仅为此网址返回FALSE?

时间:2010-04-07 23:07:51

标签: php filter-var

我有以下代码:

$url = "http://icons3.iconfinder.netdna-cdn.com/data/icons/pool/poolbird.png";

if (filter_var ($url, FILTER_VALIDATE_URL) === FALSE) {

    echo "Invalid Url";
    exit;

} else {

    echo "Works!";
}

显示:

  

无效网址(FALSE)

表示上述网址,但不适用于其他更简单的网址。这是一个错误吗?你甚至可以访问图像。

最重要的是解决方案是什么?

由于

4 个答案:

答案 0 :(得分:5)

PHP< 5.2.13包含FILTER_VALIDATE_URL中的一个错误,该错误会考虑包含“ - ”(http://bugs.php.net/51192)的网址。您需要升级您的php副本或使用不同的过滤机制。

答案 1 :(得分:1)

该代码打印“Works!”为了我。您使用的是哪个版本的PHP?你可以发布一个包含以下内容的PHP页面的链接:

<?php phpinfo(); ?>

另请参阅this question

答案 2 :(得分:1)

运行PHP 5.2.13,尝试过滤有效的URL时收到此响应:

php > var_dump(filter_var("http://www.asdf-asdf.com", FILTER_VALIDATE_URL));
bool(false)

这显然不是我希望它返回的东西。该域名有效。

现在已经明确修复了,并将包含在PHP 5.3.3和5.2.14中,更多信息在这个bug报告中: http://bugs.php.net/bug.php?id=51192

答案 3 :(得分:0)

来自http://www.php.net/get/php-5.3.2.tar.bz2/from/a/mirror的源存档包含一个奇怪版本的ext / filter / logical_filter.c,这是我在the cvs中找不到的版本。 此版本对URL的主机部分执行“额外”测试

e = url->host + strlen(url->host);
s = url->host;

while (s < e) {
  if (!isalnum((int)*(unsigned char *)s) && *s != '_' && *s != '.') {
    goto bad_url;
  }
  s++;
}

不允许在主机名中使用连字符,如icons3.iconfinder.netdna - cdn.com
非常奇怪而且非常错误。