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

Php 使用preg_quote,但保留某些特殊的正则表达式字符,php,regex,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

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* \{';
更新


虽然我很感激你在被询问几秒钟后就把它标记为一个副本,但它实际上并不是一个复制品。那里的用户只想要某些字符,而我想要除一些字符以外的所有字符。我不想手动管理要转义的内容(顺便说一句,记住PHP偶尔会添加新的转义字符)。

您可以撤消不需要的转义

$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);
}
我将delimiter参数移到了末尾,因此它可以是可选的

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