任何人都可以说这个正则表达式中我的错误是什么

时间:2012-05-30 16:59:31

标签: php validation url preg-match

我想使用这个正则表达式在php中使用preg_match函数来验证我的url但是当我使用它时它会显示“Unknown modifier'&'” 有什么问题?

$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;
        }

3 个答案:

答案 0 :(得分:4)

看起来你忘了逃避正斜杠:

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

应该是

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

答案 1 :(得分:0)

GET Query中的/(斜杠)被视为正则表达式的终止。并且不是在你的正则表达式的末尾添加了/在ANCHOR行中。

所以你需要在&。

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

bvecomes

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

答案 2 :(得分:0)

您可以使用filter_var来节省一些麻烦。

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

您可以选择将这些选项添加为第三个参数(使用二进制或组合它们):

  • FILTER_FLAG_PATH_REQUIRED
  • FILTER_FLAG_QUERY_REQUIRED