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
相关产品推荐
相关产品推荐

