正则表达式/代码,用于修复损坏的序列化PHP数据。溶液:

php
2022-08-30 19:24:55

我有一个巨大的多维数组,已经被PHP序列化了。它已存储在MySQL中,数据字段不够大...末端已被切断...我需要提取数据... 不起作用...有没有人知道可以关闭所有数组的代码...重新计算字符串长度...手动完成的数据太多了。unserialize

非常感谢。


答案 1

这是重新计算序列化数组中元素的长度:

$fixed = preg_replace_callback(
    '/s:([0-9]+):\"(.*?)\";/',
    function ($matches) { return "s:".strlen($matches[2]).':"'.$matches[2].'";';     },
    $serialized
);

但是,如果字符串包含 .,则它不起作用。在这种情况下,无法自动修复序列化数组字符串 - 需要手动编辑。";


答案 2

溶液:

1)在线试用:

序列化字符串固定器(联机工具)

2)使用功能:

unserialize( serialize_corrector($serialized_string ) ) ;

法典:

function serialize_corrector($serialized_string){
    // at first, check if "fixing" is really needed at all. After that, security checkup.
    if ( @unserialize($serialized_string) !== true &&  preg_match('/^[aOs]:/', $serialized_string) ) {
        $serialized_string = preg_replace_callback( '/s\:(\d+)\:\"(.*?)\";/s',    function($matches){return 's:'.strlen($matches[2]).':"'.$matches[2].'";'; },   $serialized_string );
    }
    return $serialized_string;
} 

还有这个脚本,我还没有测试过。


推荐