【发布时间】: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);
正如我所看到的,必须跳过第一条评论中的双引号和 prop0 中的双引号的文本,然后必须跳过 ": /* remove */ ",依此类推,而不是删除需要的 cmets要删除和删除需要保留的文本。但是无论如何,正则表达式都可以正常工作。为什么?
【问题讨论】:
-
谁能告诉我 5 个反斜杠到底会产生什么?
-
@OGHaza PHP 字符串中的 4 个反斜杠使正则表达式字符串中的 2 个反斜杠匹配(或不匹配)1 个反斜杠和
\"(不)匹配“
标签: php regex json string comments