从 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】:
您必须首先使用回溯控制动词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 强制模式失败。因此,引用的部分被跳过(并且不能在结果中,因为您使子模式失败)。
或者您使用捕获组并在替换模式中添加引用。
/\*(?:[^*]+|\*+(?!/))*+\*/
这部分描述了 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 数据中删除注释的主要内容,如果未能解决你的问题,请参考以下文章