Intereting Posts
Laravel – Как получить текущего пользователя в AppServiceProvider Внедрение видео YouTube на основе переменной PHP file_get_contents синхронный или асинхронный MySQLi обновил готовый оператор, не обновляя базу данных Является ли PHP или ванильным Perl CGI быстрее? Как интегрировать Xdebug 2.2.3 (PHP 5.53) с PhpStorm 7.0 PHP: Как я могу сгенерировать сигнатуру HmacSHA256 строки Как показать непрерывные обновления в реальном времени, такие как facebook ticker, домашняя страница meetup.com? В php существует ли способ отслеживать переменную? Определить проблему в контроллере CodeIgniter отображение нескольких строк файла, никогда не повторяющихся PHP intval () странные результаты MySQL ложно разрешает дублировать записи, когда одно из полей – NULL Отображение данных из базы данных не работает должным образом в PHP / javascript htaccess перенаправляет любые URL-адреса, заканчивающиеся на .php для индексации

Проверьте, не сериализована ли строка?

Каков наилучший способ определить, является ли строка результатом / результатом функции serialize ()?

Related of "Проверьте, не сериализована ли строка?"

Я бы сказал, попробуйте его 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))):