使用preg_quote,但保留某些特殊的正则表达式字符

时间:2019-03-08 21:25:11

标签: php regex

preg_quote函数允许指定其他转义分隔符。但是出于替换的目的,是否还有一种选择也可以指定分隔符不是以便转义?

例如,我希望转义除"/""*"之外的所有内容(包括附加的定界符"\")。

喜欢的种类:

$str = 'Replace/this line $15 #1 except \w* {';
$str = preg_quote_except($str, '/', '\*');
// Should be identical to:
$str = 'Replace\/this line \$15 \#1 except \w* \{';

更新

虽然我很感谢您在提出要求后仅几秒钟就将其标记为重复,但实际上并非How to escape only certain characters的重复。那里的用户只想某些个字符,而我想以外的所有字符。我不想手动管理要转义的内容(顺便说一句,请记住,PHP偶尔会添加要转义的新字符)。

1 个答案:

答案 0 :(得分:2)

您可以撤消不需要的转义符。

$str = preg_quote($str, '/');
$str = str_replace(['\\*', '\\\\'], ['*', '\\'], $str);

这可以是一个功能:

function preg_quote_except($str, $except, $delim = NULL) {
    $str = preg_quote($str, $delim);
    for ($i = 0; $i < strlen($except); $i++) {
        $from[] = '\\' . $except[$i];
        $to[] = $except[$i];
    }
    return str_replace($from, $to, $str);
}

然后您将其命名为:

$str = preg_quote_except($str, '\\*', '/');

我将定界符参数移到末尾,因此它是可选的。