Regex/ code to fix corrupt serialized PHP data.

前端 未结 12 733
夕颜
夕颜 2020-11-30 07:04

I have a massive multidimensional array that has been serialised by PHP. It has been stored in MySQL and the data field wasn\'t large enough... the end has been cut off... I

12条回答
  •  情书的邮戳
    2020-11-30 07:36

    I have tried everything found in this post and nothing worked for me. After hours of pain here's what I found in the deep pages of google and finally worked:

    function fix_str_length($matches) {
        $string = $matches[2];
        $right_length = strlen($string); // yes, strlen even for UTF-8 characters, PHP wants the mem size, not the char count
        return 's:' . $right_length . ':"' . $string . '";';
    }
    function fix_serialized($string) {
        // securities
        if ( !preg_match('/^[aOs]:/', $string) ) return $string;
        if ( @unserialize($string) !== false ) return $string;
        $string = preg_replace("%\n%", "", $string);
        // doublequote exploding
        $data = preg_replace('%";%', "µµµ", $string);
        $tab = explode("µµµ", $data);
        $new_data = '';
        foreach ($tab as $line) {
            $new_data .= preg_replace_callback('%\bs:(\d+):"(.*)%', 'fix_str_length', $line);
        }
        return $new_data;
    }
    

    You call the routine as follows:

    //Let's consider we store the serialization inside a txt file
    $corruptedSerialization = file_get_contents('corruptedSerialization.txt');
    
    //Try to unserialize original string
    $unSerialized = unserialize($corruptedSerialization);
    
    //In case of failure let's try to repair it
    if(!$unSerialized){
        $repairedSerialization = fix_serialized($corruptedSerialization);
        $unSerialized = unserialize($repairedSerialization);
    }
    
    //Keep your fingers crossed
    var_dump($unSerialized);
    

提交回复
热议问题