从 JSON 数据中删除注释

Posted

技术标签:

【中文标题】从 JSON 数据中删除注释【英文标题】:Remove comments from JSON data 【发布时间】:2013-11-23 11:16:58 【问题描述】:

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


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

保持不变?

【问题讨论】:

你知道 *** 有一个search 函数吗? Check This This is all you need @MihaiIorga 不适用于 "prop0": /* comment */ "Hello" cmets。 @AmalMurali 同样的事情。 @DesmondHume 你为什么不至少尝试一下? $code = preg_replace('#/\*(?:.(?!/)|[^\*](?=/)|(?<!\*)/)*\*/#s', '', $code); 【参考方案1】:

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

$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 强制模式失败。因此,引用的部分被跳过(并且不能在结果中,因为您使子模式失败)。

或者您使用捕获组并在替换模式中添加引用。

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

这部分描述了 cmets 内部的内容。

/\*           # 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 修饰符。

【讨论】:

但我无法将json_decode 应用于包含 cmets 的 JSON。 JSON 标准不允许任何 cmets,但注释在 JSON 文件和数据中被广泛使用。 这两种方法都不起作用。好像受到\"的影响,应该完全忽略。 @DesmondHume:我已经测试了代码,它运行良好。我建议您在编写代码时对其进行测试。我认为问题出在其他地方。 亲眼看看 ideone.com/K8i4jg /* don't remove **/ 被删除了,而不应该被删除。 @DesmondHume:好的,这是因为我忘记使用三个反斜杠了。我会改正的。

以上是关于从 JSON 数据中删除注释的主要内容,如果未能解决你的问题,请参考以下文章

如何从pdf文件中删除注释

用于地图注释随机化的 iOS 自定义图标

jquery便签插件

从 MapView 中删除多个注释

从 iOS 中的 UIActivityController 选项中删除注释

我应该在运行 Statement.executeUpdate 方法之前从 SQL/PLSQL 文件内容中删除注释吗