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

PHP如何将JSON中双重转义HTML实体转为原字符与标签

多层嵌套HTML实体(含双重转义)解码方案

核心思路

  • 不修改原生未转义字符,仅针对已存在的HTML实体做递归解码,直到没有可解码的实体为止
  • 遍历JSON所有层级的字符串字段,避免嵌套结构漏处理
  • 用专门的HTML实体解码函数替代mb_convert_encoding,后者仅能处理单层实体转换,无法应对多重转义场景

PHP实现示例

function recursive_html_entity_decode($data) {
    if (is_string($data)) {
        // 循环解码直到无实体可转,兼容多重转义场景
        $decoded = $data;
        do {
            $old = $decoded;
            // 兼容HTML5所有实体、处理引号,指定UTF-8编码适配法语特殊字符
            $decoded = html_entity_decode($decoded, ENT_QUOTES | ENT_HTML5, 'UTF-8');
        } while ($old !== $decoded);
        return $decoded;
    }
    // 递归处理数组/对象所有层级的键、值
    if (is_array($data) || is_object($data)) {
        foreach ($data as $key => $value) {
            $newKey = is_string($key) ? recursive_html_entity_decode($key) : $key;
            $newValue = recursive_html_entity_decode($value);
            if (is_array($data)) {
                $data[$newKey] = $newValue;
                if ($newKey !== $key) unset($data[$key]);
            } else {
                $data->$newKey = $newValue;
                if ($newKey !== $key) unset($data->$key);
            }
        }
    }
    return $data;
}

// 调用方法
$originData = json_decode($yourJsonString, true);
$decodedData = recursive_html_entity_decode($originData);
// 转回JSON时保留原生UTF-8字符,避免二次转义
$outputJson = json_encode($decodedData, JSON_UNESCAPED_UNICODE);

方案说明

  • 递归遍历会覆盖JSON所有层级的键和值,不会漏掉深层嵌套结构里的实体
  • 循环解码逻辑自动支持双重、三重甚至更多层的转义实体,比如é会先转成é,再转成é,直到没有可转换的内容停止
  • 全程只对已存在的HTML实体做解码,原生未转义的特殊字符不会被修改,不会出现误转问题
  • 显式指定UTF-8编码,适配法语特殊字符的编码需求,不会出现乱码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:15:06