使用PHP json_decode解析非标准JSON遇引号问题,求解决方案
解决非标准JSON转PHP数组的问题
方法一:完善正则表达式,补全字符串值的引号
你已经完成了键名的引号补全,接下来可以用另一段正则,为非布尔、非数字的字符串值添加引号:
// 先处理键名 $json = preg_replace('/([{,])(\s*)([A-Za-z0-9_\-]+?)\s*:/', '$1"$3":', $json); // 再处理字符串值(排除true/false、数字、{}[]) $json = preg_replace('/:\s*([^"{}\[\],\s\d]+)(?=[,\}])/', ': "$1"', $json);
这段正则会匹配冒号后、逗号或大括号前的内容,只要不是布尔值(true/false)、数字、符号,就给它套上引号。处理后你的JSON会变成标准格式:
{"mDetailedState":"CONNECTED","mExtraInfo":"3gnet","mIsAvailable":true}
之后就能正常用json_decode($json, false)解析了。
方法二:使用PHP的替代解析方案
如果正则容易出错(比如值里包含特殊字符),可以用eval(注意:仅当你完全信任这段JSON的来源时使用,避免安全风险):
// 把非标准JSON转成PHP数组格式的字符串 $phpStr = str_replace([':', '{', '}'], ['=>', '[', ']'], $json); // 用eval解析成数组 eval('$result = ' . $phpStr . ';');
这样直接把非标准JSON转成PHP数组语法,解析后就能得到目标数组。
正则学习参考资料
如果想系统学习正则,推荐:
- PHP官方文档的PCRE正则表达式章节
- 《正则表达式必知必会》这本书,适合新手快速入门
内容的提问来源于stack exchange,提问作者Pak Ho Cheung
相关产品推荐
相关产品推荐

