在PHP开发中,我们经常会遇到前端传递过来或者接口返回的HTML字符串表示的数组,这类字符串通常带有HTML标签转义或者特殊的格式标记,无法直接作为数组使用,需要将其转换为PHP可操作的有效数组。本文将介绍几种常见的转换方法,帮助开发者应对不同场景的需求。

场景一:处理HTML转义后的数组字符串
如果字符串是数组序列化后经过HTML实体转义的,比如表单提交时array(1,2,3)被转义为array(1,2,3),首先需要先反转义HTML实体,再解析字符串。我们可以使用htmlspecialchars_decode函数先处理转义,再结合eval或者正则解析,不过更推荐使用安全的字符串解析方式。
示例代码如下:
<?php
// 模拟HTML转义后的数组字符串
$htmlStr = 'a:3:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";}';
// 如果是经过HTML实体转义的序列化字符串,先反转义
$decodedStr = htmlspecialchars_decode($htmlStr);
// 使用unserialize解析序列化字符串
$arr = unserialize($decodedStr);
if ($arr !== false) {
print_r($arr);
} else {
echo "字符串解析失败";
}
?>场景二:处理带HTML标签包裹的数组字符串
有些场景下数组字符串会被HTML标签包裹,比如<div>[1,2,3]</div>,这时候需要先提取标签内的内容,再进行数组转换。可以使用strip_tags函数去除HTML标签,再处理字符串格式。
示例代码如下:
<?php
// 带HTML标签的数组字符串
$htmlArrStr = '<div>["apple","banana","orange"]</div>';
// 去除HTML标签
$content = strip_tags($htmlArrStr);
// 去掉方括号,分割字符串得到数组
$content = trim($content, '[]');
$arr = explode(',', $content);
// 去除每个元素的引号和空格
$arr = array_map(function($item) {
return trim($item, '" ');
}, $arr);
print_r($arr);
?>场景三:处理JSON格式的HTML字符串数组
如果字符串是JSON格式但经过HTML转义,比如{"list":[1,2,3]},可以先反转义再使用json_decode转换,这是最安全高效的方式。
示例代码如下:
<?php
// HTML转义的JSON格式数组字符串
$jsonHtmlStr = '{"id":1,"list":["a","b","c"]}';
// 反转义HTML实体
$jsonStr = htmlspecialchars_decode($jsonHtmlStr);
// 转换为数组
$arr = json_decode($jsonStr, true);
if (json_last_error() === JSON_ERROR_NONE) {
print_r($arr);
} else {
echo "JSON解析失败:" . json_last_error_msg();
}
?>注意事项
- 使用
eval解析字符串时存在安全风险,如果字符串来源不可信,绝对不要使用eval,优先选择unserialize或者json_decode等内置安全函数。 - 处理字符串前先判断字符串格式,不同类型的字符串需要匹配对应的解析方法,避免盲目转换导致错误。
- 如果字符串中包含特殊字符,转换前先做好转义处理,防止解析时出现语法错误。
| 字符串类型 | 推荐转换方法 | 适用场景 |
|---|---|---|
| 序列化后HTML转义字符串 | htmlspecialchars_decode + unserialize | PHP序列化的数组数据 |
| 带HTML标签包裹的数组字符串 | strip_tags + explode | 简单格式的数组字符串 |
| JSON格式HTML转义字符串 | htmlspecialchars_decode + json_decode | 接口返回的JSON数据 |