2

preg_match関数を使用してphpでURLを検証するためにこの正規表現を使用したいのですが、使用すると「不明な修飾子 '&'」と表示されますが、何が問題ですか?

$urlregex = "/^(http|ftp|https)\:\/\/";

        // USER AND PASS (optional)
        $urlregex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?";

        // HOSTNAME OR IP
        $urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)+"; // http://x.x = minimum

        // PORT (optional)
        $urlregex .= "(\:[0-9]{2,5})?";
        // PATH (optional)
        $urlregex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?";
        // GET Query (optional)
        $urlregex .= "(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?";
        // ANCHOR (optional)
        $urlregex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?\$/";
        if(preg_match($urlregex, $url) === 1)
        {
            $errors[] = "URL_ISNOTVALID";
            $ok =  false;
        }
4

3 に答える 3

4

スラッシュをエスケープするのを忘れたようです:

$urlregex .= "(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?";

する必要があります

$urlregex .= "(\?[a-z+&\$_.-][a-z0-9;:@\/&%=+\$_.-]*)?";
于 2012-05-30T17:00:41.867 に答える
0

GET クエリの / (スラッシュ) は、正規表現の終了と見なされます。ANCHOR 行に追加された正規表現の末尾の / ではありません。

したがって、その / を & の前でエスケープする必要があります。

    $urlregex .= "(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?";

得る

    $urlregex .= "(\?[a-z+&\$_.-][a-z0-9;:@\/&%=+\$_.-]*)?";

それで全部です。

于 2012-05-30T17:03:12.537 に答える
0

代わりに使用することで、トラブルを回避できますfilter_var

if (false !== ($url = filter_var($url, FILTER_VALIDATE_URL))) {
    echo "$url is a valid url";
}

必要に応じて、これらのオプションを 3 番目のパラメーターとして追加できます (バイナリを使用するか、それらを組み合わせる)。

  • FILTER_FLAG_PATH_REQUIRED
  • FILTER_FLAG_QUERY_REQUIRED
于 2012-05-30T17:04:34.767 に答える