检查一个string是否被序列化?
什么是确定一个string是否是serialize()函数的结果/输出的最好方法?
我会说,尝试反unserialize
它;-)
引用手册:
如果传递的string不能反序列化,则返回FALSE并发出E_NOTICE。
所以,你必须检查返回值是否为false
(用===
或!==
,确保没有任何问题, 0
或null
或任何等于false
,我会说) 。
只要注意通知:您可能需要/需要使用@操作符 。
例如 :
$str = 'hjkl'; $data = @unserialize($str); if ($data !== false) { echo "ok"; } else { echo "not ok"; }
会得到你:
not ok
编辑:噢,像@彼得说(感谢他!),如果你想反序列化一个布尔型假的表示,你可能会遇到麻烦:-(
因此,检查你的序列化的string是不是等于“ b:0;
”也可能有帮助; 这样的事情应该做的伎俩,我想:
$data = @unserialize($str); if ($str === 'b:0;' || $data !== false) { echo "ok"; } else { echo "not ok"; }
在试图反序列化之前testing这个特殊情况将会是一个优化 – 但是如果你不经常有一个错误的序列化值,可能不是那么有用。
我没有写这个代码,它实际上来自WordPress。 以为我会包括任何感兴趣的人,这可能是矫枉过正,但它的工作:)
<?php 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; if ( !preg_match( '/^([adObis]):/', $data, $badions ) ) return false; switch ( $badions[1] ) { case 'a' : case 'O' : case 's' : if ( preg_match( "/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data ) ) return true; break; case 'b' : case 'i' : case 'd' : if ( preg_match( "/^{$badions[1]}:[0-9.E-]+;\$/", $data ) ) return true; break; } return false; }
优化Pascal MARTIN的回应
/** * Check if a string is serialized * @param string $string */ public static function is_serial($string) { return (@unserialize($string) !== false); }
尽pipe帕斯卡尔·马丁(Pascal MARTIN)的回答非常好,但我还是很好奇你是否可以用另一种方式来处理这个问题,所以我这样做只是一个心理练
<?php ini_set( 'display_errors', 1 ); ini_set( 'track_errors', 1 ); error_reporting( E_ALL ); $valueToUnserialize = serialize( false ); //$valueToUnserialize = "a"; # uncomment this for another test $unserialized = @unserialize( $valueToUnserialize ); if ( FALSE === $unserialized && isset( $php_errormsg ) && strpos( $php_errormsg, 'unserialize' ) !== FALSE ) { echo 'Value could not be unserialized<br>'; echo $valueToUnserialize; } else { echo 'Value was unserialized!<br>'; var_dump( $unserialized ); }
它实际上工作。 唯一的警告是,如果你有一个注册的error handling程序,它可能会中断,因为$ php_errormsg是如何工作的 。
如果$ string是一个序列化的false
值,即$string = 'b:0;'
SoN9ne的函数返回false
,这是错误的
所以function会
/** * Check if a string is serialized * @param string $string */ public static function is_serial($string) { return (@unserialize($string) !== false || $string == 'b:0;'); }
$data = @unserialize($str); if($data !== false || $str === 'b:0;') echo 'ok'; else echo "not ok";
正确处理serialize(false)
。 🙂
这对我来说很好
<?php function is_serialized($data){ return (is_string($data) && preg_match("#^((N;)|((a|O|s):[0-9]+:.*[;}])|((b|i|d):[0-9.E-]+;))$#um", $data)); } ?>
/** * some people will look down on this little puppy */ function isSerialized($s){ if( stristr($s, '{' ) != false && stristr($s, '}' ) != false && stristr($s, ';' ) != false && stristr($s, ':' ) != false ){ return true; }else{ return false; } }
build立一个function
function isSerialized($value) { return preg_match('^([adObis]:|N;)^', $value); }
我喜欢这样做:
if (is_array(unserialize($serialized_string))):