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

问题描述 投票:-1回答:1

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偶尔添加新的字符来逃避)。

php regex
1个回答
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, '\\*', '/');

我将delimiter参数移到了末尾,因此它可以是可选的。

© www.soinside.com 2019 - 2024. All rights reserved.