
本文讲解如何正确解析以双引号包裹的类 JSON 字符串(如 "['a','b']"),指出 json_decode() 失败的根本原因,并提供兼容、安全的解决方案。
本文讲解如何正确解析以双引号包裹的类 json 字符串(如 `"['a','b']"`),指出 `json_decode()` 失败的根本原因,并提供兼容、安全的解决方案。
PHP 的 json_decode() 函数严格遵循 JSON 标准:它只接受双引号包围的字符串,且不允许单引号作为字符串定界符。你提供的原始字符串:
$data = "['<a class=\"__cf_email__\" data-cfemail=\"c7afa2ababa887b3a2b4b3e9a4a8aa\" href=\"/cdn-cgi/l/email-protection\">[email protected]</a>','holla@mail']";
虽然在 JavaScript 或某些宽松解析器中可被识别为数组字面量,但它不是合法 JSON——因为 JSON 要求所有字符串必须使用双引号("..."),而此处外层是双引号、内部却用单引号定义元素,导致语法冲突,故 json_decode($data, true) 返回 null。
✅ 正确做法是确保输入符合 JSON 规范:
- 将数组元素统一用双引号包裹;
- 对内部已有的双引号进行反斜杠转义(或使用单引号包裹整个字符串以避免转义混乱)。
推荐写法(安全、清晰、无需额外依赖):
立即学习“PHP免费学习笔记(深入)”;
// ✅ 合法 JSON 字符串:外层单引号避免转义,内容使用双引号
$data = '["<a class=\"__cf_email__\" data-cfemail=\"38505d545457784c5d4b4c165b5755\" href=\"/cdn-cgi/l/email-protection\">[email protected]</a>", "holla@mail"]';
$result = json_decode($data, true);
if (json_last_error() === JSON_ERROR_NONE) {
print_r($result); // 输出: Array ( [0] => <a ...>@example.com</a> [1] => holla@mail )
} else {
throw new RuntimeException('JSON 解析失败: ' . json_last_error_msg());
}⚠️ 注意事项:
-
切勿使用
eval()或create_function()解析此类字符串——存在严重 XSS 和代码执行风险; - 若数据源不可控(如来自用户输入或第三方 API),务必先校验格式,再尝试
json_decode(); - 如需处理非标准格式(如单引号数组字符串),应优先推动上游修正为标准 JSON;若无法修改,可借助正则 +
str_replace预处理(仅限可信上下文),但不推荐作为通用方案。
总结:json_decode() 的 null 返回值是明确的格式错误信号。解决关键在于让输入成为合规 JSON——统一使用双引号、正确转义、避免混用引号风格。这是保障数据安全与解析稳定性的基石。



















