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


escape string containing named subpattern with preg_quote

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

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

将被转义到

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

而不是

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

谢谢

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

例如:

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

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

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

'