
本文讲解如何安全、准确地将外层带双引号的类数组字符串(如 '["a","b"]')解析为 PHP 数组,重点解决因引号格式不合规导致 json_decode() 返回 null 的常见问题。
本文讲解如何安全、准确地将外层带双引号的类数组字符串(如 `'["a","b"]'`)解析为 php 数组,重点解决因引号格式不合规导致 `json_decode()` 返回 `null` 的常见问题。
在 PHP 开发中,有时会接收到一个外观类似数组但实际是字符串的数据,例如:
$data = "['<a class='\"__cf_email__\"' data-cfemail='\"81e9e4ededeec1f5e4f2f5afe2eeec\"' href="%5C%22/cdn-cgi/l/email-protection%5C%22">[email protected]</a>','holla@mail']";
虽然它看起来像 PHP 数组字面量,但它不是合法的 JSON 格式——JSON 规范强制要求字符串必须使用双引号(")包裹,而单引号(')是非法的。因此,直接调用:
var_dump(json_decode($data, true)); // 输出: NULL
会失败并返回 null,因为 json_decode() 严格遵循 JSON 标准,不接受单引号字符串。
✅ 正确做法是:确保输入字符串符合 JSON 语法。这意味着:
- 外层使用双引号或单引号包裹整个字符串(PHP 字符串定义);
- 内部所有字符串值必须使用双引号;
- 特殊字符(如 HTML 中的双引号、斜杠)需正确转义或使用
json_encode()生成。
✅ 推荐写法(手动修正为合法 JSON):
// ✅ 合法 JSON:内部字符串用双引号,HTML 属性中的双引号用反斜杠转义
$data = '[ "<a class='\"__cf_email__\"' data-cfemail='\"38505d545457784c5d4b4c165b5755\"' href="%5C%22/cdn-cgi/l/email-protection%5C%22">[email protected]</a>", "holla@mail" ]';
$result = json_decode($data, true);
if (json_last_error() === JSON_ERROR_NONE) {
print_r($result);
// 输出:
// Array
// (
// [0] => <a class="__cf_email__" data-cfemail="38505d545457784c5d4b4c165b5755" href="/cdn-cgi/l/email-protection">[email protected]</a>
// [1] => holla@mail
// )
} else {
echo 'JSON 解析失败:' . json_last_error_msg();
}
⚠️ 注意事项:
- 不要尝试用
str_replace("'", '"', $data)粗暴替换,这会破坏 HTML 属性中的合法单引号(如class='foo'),且无法处理嵌套引号场景; - 若原始数据来自不可信来源(如用户输入、第三方 API),切勿使用
eval()或create_function()—— 存在严重代码执行风险; - 更健壮的方案是:服务端源头改用
json_encode()输出数据;前端/外部系统应始终提供标准 JSON,而非“伪数组字符串”。
? 小结:PHP 的 json_decode() 只认标准 JSON,不是“能猜的万能解析器”。修复的关键在于校验并标准化输入格式,而非绕过规范。坚持使用 json_encode() 生成、json_decode() 解析,是保障数据交换可靠性与安全性的最佳实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











