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