4

いくつかの奇妙な理由で、以下の関数は、このURL「paradox-productions.net」がhttp://alpha.shurl.be/では無効であり、私のローカルホストでは有効であると言っています。これは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]意味するため、任意の文字、数字、またはアンダースコアを意味します。2 つ目は、ゼロ幅の正の先読みアサーション ( を使用(?=...)) を使用して、次のようなシーケンス内のすべてのダッシュを確実にキャッチする必要があります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 に答える