Каков наилучший способ определить, является ли строка результатом / результатом функции serialize ()?
Я бы сказал, попробуйте его unserialize
😉
Указание руководства:
Если переданная строка не является неэтериализуемой, возвращается FALSE и выдается E_NOTICE.
Таким образом, вы должны проверить, является ли возвращаемое значение false
или нет (с ===
или !==
, чтобы быть уверенным, что у вас нет проблемы с 0
или null
или что-то, что равно false
, я бы сказал) .
Просто остерегайтесь уведомления: вам может понадобиться / нужно использовать оператор @ .
Например :
$str = 'hjkl'; $data = @unserialize($str); if ($data !== false) { echo "ok"; } else { echo "not ok"; }
Вы получите:
not ok
EDIT: О, и, как @Peter сказал (спасибо ему!), У вас могут возникнуть проблемы, если вы пытаетесь неэриализовать представление логического false 🙁
Таким образом, проверка того, что ваша сериализованная строка не равна « b:0;
», также может быть полезна; что-то вроде этого должно сделать трюк, я полагаю:
$data = @unserialize($str); if ($str === 'b:0;' || $data !== false) { echo "ok"; } else { echo "not ok"; }
тестирование этого особого случая перед попыткой несериализации было бы оптимизацией – но, вероятно, не так уж и полезно, если у вас часто не было ложного сериализованного значения.
Я не писал этот код, это на самом деле из 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; }
Оптимизация ответа Паскаля МАРТИНА
/** * Check if a string is serialized * @param string $string */ public static function is_serial($string) { return (@unserialize($string) !== false); }
Несмотря на превосходный ответ Паскаля МАРТИНА, мне было любопытно, можете ли вы подойти к этому по-другому, поэтому я сделал это так же, как умственное упражнение
<?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 ); }
И это действительно работает. Единственное предостережение в том, что он, скорее всего, сломается, если у вас есть зарегистрированный обработчик ошибок из-за того, как работает $ php_errormsg .
Если $ string является сериализованным false
значением, то есть $string = 'b:0;'
Функция SoN9ne возвращает false
, это неправильно
поэтому функция будет
/** * 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)); } ?>
встраиваться в функцию
function isSerialized($value) { return preg_match('^([adObis]:|N;)^', $value); }
/** * 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; } }
Я предпочитаю делать это так:
if (is_array(unserialize($serialized_string))):