无法使用PHP中的preg_replace正确转义未转义的特殊字符

时间:2016-09-23 00:37:33

标签: php regex escaping preg-replace

我试图使用preg_replace来反转带有反斜杠的多行字符串中的所有特殊字符,但是这个字符串被传递出来并重复传回,所以为了避免任何混淆,我想使用正则表达式它只能转义未转义的特殊字符(也不包括空格,换行符,回车符和转义字符本身)。即,:

$foo \$bar :\:\n

应该转义为:

\$foo \$bar \:\:\n

并且没有像下面那样转义两次:

\$foo \\$bar \:\\:\\n

我已经接近以下内容:

preg_replace("/([^\\\\])([^a-z0-9\\\\ \r\n])/i","$1\\\\$2",$input);

但是当两个相同的特殊字符按顺序出现时,只有两个中的第一个被转义。

例如:

...

变为:

\..\..

但我真的想要:

\.\.\.\.

对于荒谬的问题感到抱歉,或者如果我做任何愚蠢的事情!在此先感谢:)

1 个答案:

答案 0 :(得分:1)

尝试在正则表达式中使用负向lookbehind。像这样:

preg_replace("/(?<!\\\\)([^a-z0-9\\\\ \r\n])/i","\\\\$1",$input)