如何在PHP中将WordPress插件返回的序列化数据转为数组?
解决WordPress All Export Pro中unserialize序列化数据失败的问题
问题分析
你遇到的unserialize(): Error at offset 0 of 99 bytes错误,核心原因是All Export Pro环境中传入的序列化字符串和本地测试版本不一致——大概率是插件自动处理了字符串的转义、编码,或者添加了隐藏字符(比如BOM头),导致unserialize无法解析长度匹配的内容。
可行解决方案
1. 修复转义/实体编码问题
你提供的序列化数据里包含"(HTML实体双引号),本地测试时可能已自动解码,但All Export Pro中可能保留了实体编码,导致长度计算错误。先解码再反序列化:
// 假设$serialized是从插件获取的原始字段值 $fixed_serialized = htmlspecialchars_decode($serialized); $array = unserialize($fixed_serialized);
如果是PHP转义符(\\")的问题,改用stripslashes处理:
$fixed_serialized = stripslashes($serialized); $array = unserialize($fixed_serialized);
2. 移除隐藏的BOM头或空白字符
部分情况下,字段内容可能带有UTF-8 BOM头或多余空白,导致unserialize解析失败,用ltrim清理:
$fixed_serialized = ltrim($serialized, "\x00\x09\x0A\x0B\x0C\x0D\x20\xEF\xBB\xBF"); $array = unserialize($fixed_serialized);
3. 验证字符串完整性(排查用)
先输出原始字符串的真实内容,确认是否和本地测试的一致:
// 输出转义后的字符串,查看是否有多余字符 echo htmlspecialchars($serialized); // 对比长度是否匹配报错中的99字节 echo strlen($serialized);
如果长度不符,说明插件确实对字段做了额外处理,根据输出的实际内容调整修复逻辑。
4. 绕过unserialize的替代方案
如果以上方法都无效,直接用正则提取所有选项文本(适合你这种纯字符串数组的序列化格式):
preg_match_all('/s:\d+:"([^"]+)";/', $serialized, $matches); // $matches[1]就是提取出的所有房产设施数组 $facilities = $matches[1];
内容的提问来源于stack exchange,提问作者Davi Pereira
相关产品推荐
相关产品推荐

