【问题标题】:Can anyone explain how this comment-removing regex works?谁能解释这个删除评论的正则表达式是如何工作的?
【发布时间】:2013-12-01 11:25:31
【问题描述】:

这是其中一种情况,当您有工作要做但对它的工作效果感到惊讶时。我有点难以理解为什么下面的正则表达式,即从 JSON 字符串中删除 cmets 而不会触及字符串值中的 cmets,实际上在所有情况下都可以无条件地工作,无论我在 cmets 中放入多少双引号以“愚弄” " 正则表达式:

$str = <<<'ndoc'
{
    // comment "
    "prop0": /* remove */ "hello /* preserve */ there", // remove
    "prop1": /* remove " */ "hi // preserve", /* remove " */
    "prop2": /* remove */ "hi // preserve"
}
ndoc;
$str = preg_replace("/\"(?<!\\\\\")(?:[^\\\\\"]++|\\\\{2}|\\\\.)*\"(*SKIP)(*FAIL)|\\/\\/.*(?=\\R)|\\/\\*\\C*?\\*\\//u", "", $str);
var_dump($str);

http://ideone.com/rLP1nq

正如我所看到的,必须跳过第一条评论中的双引号和 prop0 中的双引号的文本,然后必须跳过 ": /* remove */ ",依此类推,而不是删除需要的 cmets要删除和删除需要保留的文本。但是无论如何,正则表达式都可以正常工作。为什么?

【问题讨论】:

  • 谁能告诉我 5 个反斜杠到底会产生什么?
  • @OGHaza PHP 字符串中的 4 个反斜杠使正则表达式字符串中的 2 个反斜杠匹配(或不匹配)1 个反斜杠和 \"(不)匹配“

标签: php regex json string comments


【解决方案1】:

我重新格式化了您的源代码并将 cmets 添加到模式中。分隔符更改为 (),因此不需要对斜线进行转义。 x 修饰符允许格式化模式(空格被忽略,# cmets 可能)。

这应该使模式更具可读性。您可以看到第一部分与“value”-String 匹配。如果匹配,则跳过替换,否则匹配并替换 // 和 /**/ cmets。

$str = <<<'ndoc'
{
    // comment "
    "prop0": /* remove */ "hello /* preserve */ there", // remove
    "prop1": /* remove " */ "hi // preserve", /* remove " */
    "prop2": /* remove */ "hi // preserve"
}
ndoc;

$pattern = "(
  # a starting double quote
  \" 
  # string contents including escape sequences
  (?<!\\\\\")(?:[^\\\\\"]++|\\\\{2}|\\\\.)* 
  # the ending double quote
  \"
  # skip double quote string matches
  (*SKIP)(*FAIL) 
  # or
  | 
  # // comments
  //.*(?=\\R)  
  # or
  | 
  # /* */ comments
  /\\*\\C*?\\*/
)xu";

$str = preg_replace($pattern, "", $str);
var_dump($str);

【讨论】:

  • 谢谢,但是为什么将双引号随机放入 cmets 不会改变处理的文本和跳过的文本?
  • " 在 cmets 的相应模式部分中是允许的。"." 和 "\C" 允许双引号。
  • 也许我很笨,但我仍然不明白为什么第一对引号(一个是注释,另一个是第一个属性名称)没有被跳过并且它不会破坏其他所有内容
  • 它已经开始匹配 //... 注释。点匹配除 \n (换行符)之外的所有字符。直到下一个换行符,所有字符都将成为该匹配的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
相关资源
最近更新 更多