php-从JSON数据中删除注释

我需要从JSON数据中删除所有/*…*/样式注释.我该如何使用正则表达式来实现这样的字符串值

{
    "propName": "Hello \" /* hi */ there."
}

维持不变?

解决方法:

您必须首先使用回溯控制动词SKIP和FAIL(或捕获)避免双引号内的所有内容

$string = <<<'LOD'
{
    "propName": "Hello \" /* don't remove **/ there." /*this must be removed*/
}
LOD;

$result = preg_replace('~"(?:[^\\\"]+|\\\.)*+"(*SKIP)(*FAIL)|/\*(?:[^*]+|\*+(?!/))*+\*/~s', '',$string);

// The same with a capture:

$result = preg_replace('~("(?:[^\\\"]+|\\\.)*+")|/\*(?:[^*]+|\*+(?!/))*+\*/~s', '$1',$string);

图案细节:

"(?:[^\\\"]+|\\\.)*+"

这部分描述引号内的可能内容:

"              # literal quote
(?:            # open a non-capturing group
    [^\\\"]+   # all characters that are not \ or "
  |            # OR
    \\\.)*+    # escaped char (that can be a quote)
"

然后,您可以使用(* SKIP)(* FAIL)或(* SKIP)(?!)使此子模式失败.如果此后模式失败,则SKIP会在此点之前禁止回溯. FAIL强制模式失败.因此,带引号的部分将被跳过(并且不能出现在结果中,因为之后会使子模式失败).

或者,您使用捕获组,然后在替换模式中添加参考.

/\*(?:[^*]+|\*+(?!/))*+\*/

此部分描述注释中的内容.

/\*           # open the comment
(?:           
    [^*]+     # all characters except *
  |           # OR
    \*+(?!/)  # * not followed by / (note that you can't use 
              # a possessive quantifier here)
)*+           # repeat the group zero or more times
\*/           # close the comment

仅当反斜杠在引号内的换行符之前时,才使用s修饰符.

上一篇:如何在C#中使用NPOI Excel添加单元格注释?


下一篇:前端javascript基础总结(1)js的构成以及数据类型