这个问题的解决方案是否比我找到的解决方案更好或更强大?
$string = "a:1:{s:19:\"is_featured_service\";b:0;}";
$unserialized_string = @unserialize($string);
if ($unserialized_string === false){
$unserialized_string = 'another value';
}
答案 0 :(得分:1)
我喜欢这个,因为你不必试图压制错误:
/**
* Check value to find if it is serialized data.
*
* Function borrowed from Wordpress.
*
* @param mixed $data Value to check to see if was serialized.
* @return bool False if not serialized and true if it was.
*/
function is_serialized( $data ) {
// if it isn't a string, it isn't serialized
if ( ! is_string( $data ) )
return false;
$data = trim( $data );
if ( 'N;' == $data )
return true;
$length = strlen( $data );
if ( $length < 4 )
return false;
if ( ':' !== $data[1] )
return false;
$lastc = $data[$length-1];
if ( ';' !== $lastc && '}' !== $lastc )
return false;
$token = $data[0];
switch ( $token ) {
case 's' :
if ( '"' !== $data[$length-2] )
return false;
case 'a' :
case 'O' :
return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data );
case 'b' :
case 'i' :
case 'd' :
return (bool) preg_match( "/^{$token}:[0-9.E-]+;\$/", $data );
}
return false;
}
$string = "a:1:{s:19:\"is_featured_service\";b:0;}";
$x = is_serialized( $string )
? unserialize( $string )
: 'Some default value';
答案 1 :(得分:1)
如果您不想处理错误,我只会保留@
,这似乎就是您所做的。然后将其更改为三元组以使其变小:
$unserialized_string = @unserialize($string) ?: 'another value';