PHP正则格式化无引号JSON字符串,解决含逗号文本格式问题
PHP正则修复含内部逗号的无效JSON
问题分析
你遇到的无效JSON核心问题有两个:
- 键和值均未包裹双引号,不符合JSON规范
- 值内部包含逗号,直接用
str_replace会错误将这些逗号识别为键值对的分隔符,导致值被切割
原始无效JSON:
[{2:,0:1,1:Rodapi\u00e9s 1-a, 2-a, bloque 6}]
目标有效JSON:
[{"2":"","0":"1","1":"Rodapi\u00e9s 1-a, 2-a, bloque 6"}]
正则解决方案
利用正则匹配数字键的特征,并通过正向预查精准识别每个键值对的边界,避免误切割值内部的逗号。
代码实现
$invalidJson = '[{2:,0:1,1:Rodapi\u00e9s 1-a, 2-a, bloque 6}]'; // 正则替换:给数字键和对应值添加双引号,同时保留值内部的逗号 $validJson = preg_replace('/(\d+):([^,]*?(?=\d+:|}))/s', '"$1":"$2"', $invalidJson); // 验证结果 var_dump($validJson); $data = json_decode($validJson, true); var_dump($data);
正则表达式说明
(\d+):捕获数字类型的键,作为分组1::匹配键和值之间的冒号([^,]*?(?=\d+:|})):非贪婪匹配值内容,直到遇到下一个数字:(下一个键的开头)或}(对象结束),确保值内部的逗号被完整保留/s修饰符:让.匹配换行符(这里虽无换行,但兼容复杂场景)
输出结果
执行后得到的有效JSON完全符合目标格式,json_decode可以正常解析出数组:
string(71) "[{"2":"","0":"1","1":"Rodapi\u00e9s 1-a, 2-a, bloque 6"}]" array(1) { [0]=> array(3) { ["2"]=> string(0) "" ["0"]=> string(1) "1" ["1"]=> string(31) "Rodapiés 1-a, 2-a, bloque 6" } }
内容的提问来源于stack exchange,提问作者LauraEld
相关产品推荐
相关产品推荐

