【问题标题】:Unable to properly escape unescaped special characters using preg_replace in PHP无法在 PHP 中使用 preg_replace 正确转义未转义的特殊字符
【发布时间】: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


【解决方案1】:

尝试在正则表达式中使用否定的lookbehind。像这样:

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

【讨论】:

  • 谢谢,我会试试的。负面的看法到底有什么作用?
  • 看来这个话题已经被覆盖了here
猜你喜欢
  • 2011-07-09
  • 1970-01-01
  • 2014-05-11
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 2015-05-23
相关资源
最近更新 更多