【发布时间】:2017-01-31 17:30:24
【问题描述】:
我正在尝试使用 preg_replace 来转义带有反斜杠的多行字符串中的所有特殊字符,但是这个字符串会被传递出去并反复传递回来,所以为了避免任何混淆,我想使用一个正则表达式,它只转义未转义的特殊字符(也不包括空格、换行符、回车和转义字符本身)。即:
$foo \$bar :\:\n
应该转义为:
\$foo \$bar \:\:\n
并且没有像下面这样逃脱两次:
\$foo \\$bar \:\\:\\n
我已经接近了以下几点:
preg_replace("/([^\\\\])([^a-z0-9\\\\ \r\n])/i","$1\\\\$2",$input);
但是当两个相同的特殊字符依次出现时,只有两个中的第一个被转义。
例如:
....
变成:
\..\..
但我真的想要:
\.\.\.\.
抱歉这个荒谬的问题,或者如果我在做任何愚蠢的事情!在此先感谢:)
【问题讨论】:
-
我认为这与正则表达式能够按顺序匹配两个特殊字符,在第一组和第二组中捕获它们有关,因此只能转义其中一个。但我会认为 preg_replace 会从字符串的开头到结尾,所以它会匹配第一个未转义的字符,将其转义,然后是下一个未转义的字符,依此类推。如果第一组与第二组的比赛相同,那么正确的方法是阻止第一组的比赛,反之亦然?我该怎么做?
标签: php regex escaping preg-replace