4

出于某种奇怪的原因,下面的函数说这个 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);
}
?>

4

1 回答 1

3

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

如果您可以升级到工作版本,那么这样做可能是个好主意。如果不能,您可以通过在验证之前从字符串中删除由其他有效 url 字符分隔的所有破折号来解决此问题。下面的正则表达式并不完美,但如果您知道破折号只会出现在字母、数字或下划线之间(通常是正确的,但请注意这不会处理某些不太可能的边缘情况),它应该可以工作。

$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)
于 2012-04-22T09:42:04.960 回答