filter_var($ url,FILTER_VALIDATE_URL)在PHP 5.3.2中表现得很奇怪

时间:2012-04-22 09:30:12

标签: php ubuntu

由于一些奇怪的原因,下面的函数说这个url“paradox-productions.net”在http://alpha.shurl.be/上无效,在我的localhost上有效。 它是PHP中的错误还是可能导致这种情况的原因? 谁能证实这一点?可以解决或者我需要在服务器上进行PHP升级吗?

phpinfo:http://alpha.shurl.be/phpinfo.php

功能:

<?php
function validUrl($url) {
    var_dump($url);
    if(strpos($url, ".") !== false) {
        var_dump($url);
        if(strpos($url, "://") === false) {
            $url = "http://" . $url;
            var_dump($url);
        }
    }

    if(filter_var($url, FILTER_VALIDATE_URL)) {
        echo "VALID\n";
    }
    else {
        echo "INVALID\n";
    }
    var_dump(filter_var($url, FILTER_VALIDATE_URL));

    return filter_var($url, FILTER_VALIDATE_URL);
}
?>

<?php function validUrl($url) { var_dump($url); if(strpos($url, ".") !== false) { var_dump($url); if(strpos($url, "://") === false) { $url = "http://" . $url; var_dump($url); } } if(filter_var($url, FILTER_VALIDATE_URL)) { echo "VALID\n"; } else { echo "INVALID\n"; } var_dump(filter_var($url, FILTER_VALIDATE_URL)); return filter_var($url, FILTER_VALIDATE_URL); } ?>

1 个答案:

答案 0 :(得分:3)

这是PHP 5.3.2中的已知错误。它认为带有破折号的URL无效。见https://bugs.php.net/bug.php?id=51258。您的本地PHP必须是不存在此错误的不同版本。

如果您可以升级到工作版本,可能最好这样做。如果不能,可以通过在验证之前删除字符串中其他有效URL字符分隔的所有破折号来解决此问题。下面的正则表达式并不完美,但是如果你知道破折号只会出现在字母,数字或下划线之间(通常是真的,但只是要注意这不会涉及某些不太可能的边缘情况)。< / p>

$url_to_validate = preg_replace("/([\w\d])-(?=[\w\d])/", '\\1\\2', $url);

\w表示“任何字母或下划线”,\d表示“任意数字”,因此[\w\d]表示任何字母,数字或下划线。第二个需要零宽度正向前瞻断言(使用(?=...))以确保它捕获像a-b-c-d-e这样的序列中的所有破折号(没有它,它会错过该序列中的所有其他破折号)。

这是错误报告的主体:

  

说明

     

FILTER_VALIDATE_URL不允许主机名中包含短划线/连字符。那太傻了。

     

测试脚本:

$ php -r 'var_dump(filter_var("http://www.something.com/",
FILTER_VALIDATE_URL));'

$ php -r 'var_dump(filter_var("http://www.some-thing.com/",
FILTER_VALIDATE_URL));'
     

预期结果:

$ php -r 'var_dump(filter_var("http://www.something.com/",
FILTER_VALIDATE_URL));' string(25) "http://www.something.com/"

$ php -r 'var_dump(filter_var("http://www.some-thing.com/",
FILTER_VALIDATE_URL));' string(26) "http://www.some-thing.com/"
     

实际结果:

$ php -r 'var_dump(filter_var("http://www.something.com/",
FILTER_VALIDATE_URL));' string(25) "http://www.something.com/"

$ php -r 'var_dump(filter_var("http://www.some-thing.com/",
FILTER_VALIDATE_URL));' bool(false)