
本文介绍如何安全、可靠地将形如 [2 => ["Iphone 10", ...], 3 => ["Mac 10", ...]] 的 PHP 风格字符串解析为原生 PHP 数组,重点强调避免 eval() 的风险,并推荐 JSON 替代方案与自定义解析策略。
本文介绍如何安全、可靠地将形如 [2 => ["iphone 10", ...], 3 => ["mac 20", ...]] 的 php 风格字符串解析为原生 php 数组,重点强调避免 eval() 的风险,并推荐 json 替代方案与自定义解析策略。
直接将类似 PHP 数组语法的字符串(如 "[2 => ["Iphone 10", "Iphone 20"], 3 => ["Mac 10", "Mac 20"]]")转为数组,绝不可使用 eval() 或强制类型转换(如 (array)$str)——前者存在严重代码执行漏洞,后者完全无效。
✅ 推荐首选方案:改用 JSON 格式传输与存储
这是最安全、标准且可维护的方式。服务端/数据源应输出合法 JSON,例如:
// 正确的数据准备方式(推荐)
$data = [
2 => ["Iphone 10", "Iphone 20", "Iphone 30", "Iphone 40"],
3 => ["Mac 10", "Mac 20", "Mac 30", "Mac 40"]
];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
// 输出:{"2":["Iphone 10","Iphone 20","Iphone 30","Iphone 40"],"3":["Mac 10","Mac 20","Mac 30","Mac 40"]}
PHP 端解析仅需一行:
$jsonString = '{"2":["Iphone 10","Iphone 20"],"3":["Mac 10","Mac 20"]}';
$array = json_decode($jsonString, true); // 第二个参数 true 返回关联数组
var_dump($array);
// 输出:array(2) { [2]=> array(2) { ... } [3]=> array(2) { ... } }
⚠️ 若因历史原因必须解析 PHP 风格字符串(非 JSON),请使用白名单正则 + unserialize() 模拟解析(不推荐 eval)或借助 var_export() 反向工程——但强烈建议推动上游改造为 JSON。临时应急可采用以下受限解析逻辑(仅支持简单标量和嵌套数组,不含对象/资源):
function parsePhpArrayString($str) {
// 清理:替换 => 为 =>,移除多余空格,补全括号
$str = str_replace(['=>', '[', ']'], ['=>', 'array(', ')'], $str);
$str = preg_replace('/(\d+|"[^"]*")\s*=>/', '$1 =>', $str); // 标准化键值分隔
// 构造可安全 eval 的表达式(仅限可信来源!)
if (!preg_match('/^[a-zA-Z0-9\s"\',\[\]\(\)=>_]+$/', $str)) {
throw new InvalidArgumentException('Unsafe string detected');
}
// ⚠️ 仅限完全可信的内部数据源!生产环境禁用
return eval("return $str;");
}
// 示例(再次强调:仅测试/隔离环境使用)
$raw = '2 => ["Iphone 10", "Iphone 20"], 3 => ["Mac 10", "Mac 20"]';
$result = parsePhpArrayString("array($raw)");
? 关键总结:
- ✅ 永远优先选择 JSON:标准化、语言无关、内置函数支持、无执行风险;
- ❌ 禁止在生产环境使用 eval() 解析用户输入或外部字符串;
- ? 若无法修改数据源,请推动接口升级为 JSON 格式,而非妥协于脆弱解析逻辑;
- ? 对遗留系统,可封装校验型解析器(如基于 json_decode + 格式预处理),但需严格限定输入范围并充分测试边界情况。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











