2016-09-23 67 views
0

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

$foo \$bar :\:\n 

应该逃到成为:

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

,而不是逃脱象下面这样两次:

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

我用下面得到接近:

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

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

例如:

....

变为:

\..\.. 

但实际上我想:

\.\.\.\. 

对不起,可笑的问题,或者如果我是做任何愚蠢的事!在此先感谢:)

+0

我认为这是值得做的正则表达式能够在序列匹配两个特殊字符,捕捉他们在一组,2组,所以只有逃避其中之一。但是我希望preg_replace从开始到结束的字符串都会经过,所以它会匹配第一个非转义字符,转义它,然后是下一个非转义字符等等。 如果第二组的匹配与第二组的匹配相同,反之亦然,正确的方法是阻止第一组的匹配吗?我怎么做? –

回答

1

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

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

谢谢,我会试试看。背后的负面影响究竟是什么? –

+0

看起来这个主题已经覆盖[这里](http://stackoverflow.com/questions/2973436/regex-lookahead-lookbehind-and-atomic-groups) – Nick