如何用preg_replace修复JSON中引号内未转义的引号?
修复JSON字符串内部未转义引号的方案
我正好处理过类似的JSON修复问题,给你一个精准的解决方案,用preg_replace_callback就能搞定字符串内部未转义引号的转义需求。
核心思路
我们需要先精准匹配JSON里的每一个字符串(也就是被双引号包裹的内容),然后在这个字符串内部,把所有未被转义的双引号替换成\"。直接用普通的preg_replace容易误处理字符串的首尾引号,所以用回调函数来处理更稳妥。
具体代码实现
// 你的错误JSON字符串 $invalidJson = '{"productName": "Widget "Foo"", "productVariation": ""}'; // 修复未转义的内部引号 $fixedJson = preg_replace_callback( '/"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"/s', function($matches) { // 把捕获到的字符串内部的未转义引号转义 $escapedInner = str_replace('"', '\\"', $matches[1]); // 重新包裹双引号返回 return '"' . $escapedInner . '"'; }, $invalidJson ); // 输出修复后的JSON echo $fixedJson;
代码解释
- 正则表达式:
/"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"/s":匹配字符串开头的双引号([^"\\\\]*(?:\\\\.[^"\\\\]*)*):捕获字符串的核心内容,确保跳过已经转义的字符(比如\"、\\)/s:让.匹配换行符,支持多行JSON字符串
- 回调函数:负责把捕获到的字符串内部的所有未转义双引号替换为
\",再重新用双引号包裹,避免误转义字符串的首尾引号。
效果演示
输入错误JSON:
{"productName": "Widget "Foo"", "productVariation": ""}
输出修复后的JSON:
{"productName": "Widget \"Foo\"", "productVariation": ""}
注意事项
这个方案专门针对你描述的「字符串内部未转义引号」问题,如果你的JSON还有其他格式错误(比如未闭合的括号、非法转义字符),可能需要结合其他修复逻辑,但对于当前场景完全够用。
内容的提问来源于stack exchange,提问作者Leif Neland
相关产品推荐
相关产品推荐

