检查一个string是否被序列化?

什么是确定一个string是否是serialize()函数的结果/输出的最好方法?

我会说,尝试反unserialize它;-)

引用手册:

如果传递的string不能反序列化,则返回FALSE并发出E_NOTICE。

所以,你必须检查返回值是否为false (用===!== ,确保没有任何问题, 0null或任何等于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))):