包含带有preg_quote的命名子模式的转义字符串

时间:2012-04-24 13:30:22

标签: php regex

有没有办法使用preg_quote并忽略命名的子模式进行转义? 例如:

/login/?next=(?P<next_url>.*)

将被转义为

\/login\/\?next\=(?P<next_url>.*)

而不是

\/login\/\?next\=\(\?P\<next_url\>\.\*\)

由于

2 个答案:

答案 0 :(得分:2)

您可以在单独的部分中构建正则表达式,以便仅preg_quote所需表达式的部分。

例如:

$pattern = preg_quote('\/login\/?next=').'(?P<next_url>.*)';

答案 1 :(得分:1)

我通过实现自己的功能做了一个解决方法:

protected function escapeUrlPattern($pattern) {
    $chars = array('/', '=', '-', '.', '\\', '+', '*', '?', '^', '$', '{', '}', '!', '<', '>', '|', ':',);
    $patternChars = str_split($pattern);
    $idle = false;
    $escapedPattern = "";
    foreach ($patternChars as $char) {
        if ($char == "(" || $char == "[")
            $idle = true;

        if (!$idle && in_array($char, $chars))
            $char = "\\" . $char;

        $escapedPattern .= $char;

        if ($char == ")" || $char == "]")
            $idle = false;
    }
    return $escapedPattern;
}

`