You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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;

代码解释

  1. 正则表达式:/"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"/s
    • ":匹配字符串开头的双引号
    • ([^"\\\\]*(?:\\\\.[^"\\\\]*)*):捕获字符串的核心内容,确保跳过已经转义的字符(比如\"、\\)
    • /s:让.匹配换行符,支持多行JSON字符串
  2. 回调函数:负责把捕获到的字符串内部的所有未转义双引号替换为\",再重新用双引号包裹,避免误转义字符串的首尾引号。

效果演示

输入错误JSON:

{"productName": "Widget "Foo"", "productVariation": ""}

输出修复后的JSON:

{"productName": "Widget \"Foo\"", "productVariation": ""}

注意事项

这个方案专门针对你描述的「字符串内部未转义引号」问题,如果你的JSON还有其他格式错误(比如未闭合的括号、非法转义字符),可能需要结合其他修复逻辑,但对于当前场景完全够用。

内容的提问来源于stack exchange,提问作者Leif Neland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:10:32