I was getting PHP `unseralize` errors when working with some WordPress option values.
PHP Notice: unserialize(): Error at offset 4854 of 24578 bytes
One of the comments in the `unserialize` documentation was suggested matching all string values, and correct the string length. Working with that, and checking the area of breakage (byte 4854) I found a string which was declared as 64 characters, but serialized as 61. So I went ahead and adapted the 6 year snippet to work on PHP 7.1.
// $val = SERIALIZED_VALUE; function fix_serialized_string_lengths($matches) { if ( strlen( $matches[2] ) == (int)$matches[1] ) return $matches[0]; $idx = strpos( $matches[0], ':', 2 ); return 's:' . strlen( $matches[2] ) . substr( $matches[0], $idx ); } $arr = @unserialize( $val ); if ( $arr === FALSE ) { $val = preg_replace_callback( '!s:(\d+):"(.*?)";!s', 'fix_serialized_string_lengths', $val ); $arr = unserialize( $val ); }