2

我想使用这个正则表达式在 php 中使用 preg_match 函数验证我的 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";
}

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

  • FILTER_FLAG_PATH_REQUIRED
  • FILTER_FLAG_QUERY_REQUIRED
于 2012-05-30T17:04:34.767 回答