导语:叶子在迁移一个wordpress网站时,需要对数据重组,但由于部分数据使用的序列化格式存储,叶子需要将它们反序列化后添加到另外的地方,但是,在执行过程中遇到了函数unserialize返回值为假的问题。
unserialize失败的原因
由于编码格式的不同,有些字符在序列化计数的时候,虽然占用了一个字符的位置,但算作2个字符的长度,在php中反序列化的时候,由于计数的长度与字符串真实的长度不一致导致反序列化不成功。
解决方法
我们需要在php中重新计算字符的个数,摘抄实现代码如下:
$serial_str =$result->meta_value; $serial_str = preg_replace_callback('/s:(\d+):"([\s\S]*?)";/', function($matches) { return 's:'.strlen($matches[2]).':"'.$matches[2].'";'; }, $serial_str); $meta_values = unserialize($serial_str);
第一行代码的意思是,将一个序列化字符串$result->meta_value赋值给变量$serial_str。
第二行代码的意思是,利用函数preg_replace_callback重新计算每个字符串的个数,其中使用了正则表达式。
第三行代码的意思是,字符串反序列化成为数组。
结束
你学会了吗?