unserialize serialize online example ejemplo array php serialization

online - serialize php ejemplo



Verifique si una cadena está serializada? (11)

¿Cuál es la mejor manera de determinar si una cadena es el resultado / resultado de la función serialize ()?


A pesar de la excelente respuesta de Pascal MARTIN, tenía curiosidad de poder abordar esto de otra manera, así que lo hice solo como un ejercicio mental.

<?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 ); }

Y realmente funciona. La única advertencia es que es probable que se rompa si tiene un controlador de error registrado debido a cómo funciona $ php_errormsg .


Esto funciona bien para mi

<?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)); } ?>


Hay una solución de WordPress: (los detalles están aquí)

function is_serialized($data, $strict = true) { // 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 (strlen($data) < 4) { return false; } if ('':'' !== $data[1]) { return false; } if ($strict) { $lastc = substr($data, -1); if ('';'' !== $lastc && ''}'' !== $lastc) { return false; } } else { $semicolon = strpos($data, '';''); $brace = strpos($data, ''}''); // Either ; or } must exist. if (false === $semicolon && false === $brace) return false; // But neither must be in the first X characters. if (false !== $semicolon && $semicolon < 3) return false; if (false !== $brace && $brace < 4) return false; } $token = $data[0]; switch ($token) { case ''s'' : if ($strict) { if (''"'' !== substr($data, -2, 1)) { return false; } } elseif (false === strpos($data, ''"'')) { return false; } // or else fall through case ''a'' : case ''O'' : return (bool)preg_match("/^{$token}:[0-9]+:/s", $data); case ''b'' : case ''i'' : case ''d'' : $end = $strict ? ''$'' : ''''; return (bool)preg_match("/^{$token}:[0-9.E-]+;$end/", $data); } return false; }


No escribí este código, es de WordPress en realidad. Pensé que lo incluiría para cualquier persona interesada, podría ser exagerado, pero funciona :)

<?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; }


Optimizando la respuesta de Pascal MARTIN

/** * Check if a string is serialized * @param string $string */ public static function is_serial($string) { return (@unserialize($string) !== false); }


Prefiero hacerlo de esa manera:

if (is_array(unserialize($serialized_string))):


Si $ string es un valor false serializado, es decir $string = ''b:0;'' La función de SoN9ne devuelve false , está mal

por lo que la función sería

/** * Check if a string is serialized * @param string $string */ public static function is_serial($string) { return (@unserialize($string) !== false || $string == ''b:0;''); }


construir en una función

function isSerialized($value) { return preg_match(''^([adObis]:|N;)^'', $value); }


Yo diría, intentaría unserialize ;-)

Citando el manual:

En caso de que la cadena pasada no sea deserializable, se devuelve FALSO y se emite E_NOTICE.

Entonces, debe verificar si el valor de retorno es false o no (con === o !== , para asegurarse de no tener ningún problema con 0 o null o cualquier cosa que sea igual a false , diría) .

Solo tenga cuidado con el aviso: es posible que desee / necesite usar el operador @ .

Por ejemplo :

$str = ''hjkl''; $data = @unserialize($str); if ($data !== false) { echo "ok"; } else { echo "not ok"; }

Te conseguirá:

not ok


EDITAR: Ah, y como dice @Peter (¡gracias a él!), Es posible que tengas problemas si intentas deserializar la representación de un booleano falso :-(

Por lo tanto, verificar que su cadena serializada no sea igual a " b:0; " podría ser útil también; algo como esto debería hacer el truco, supongo:

$data = @unserialize($str); if ($str === ''b:0;'' || $data !== false) { echo "ok"; } else { echo "not ok"; }

probar ese caso especial antes de intentar la deserialización sería una optimización, pero probablemente no tan útil, si a menudo no tiene un valor serializado falso.


$data = @unserialize($str); if($data !== false || $str === ''b:0;'') echo ''ok''; else echo "not ok";

Maneja correctamente el caso de serialize(false) . :)


/** * 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; } }