WordPress中PHP编码问题导致反序列化函数unserialize失败的解决方法

导语:叶子在迁移一个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重新计算每个字符串的个数,其中使用了正则表达式。

第三行代码的意思是,字符串反序列化成为数组。

结束

你学会了吗?

发表评论

邮箱地址不会被公开。 必填项已用*标注