Функция is_serialized() в WordPress: пример использования и описание

Функция is_serialized() в WordPress

Функция is_serialized() проверяет, является ли данное значение сериализованной строкой. Сериализация — это процесс, при котором данные преобразуются в строку, чтобы их было проще хранить или передавать.

Как работает is_serialized()

Если переданное значение не является строкой, функция вернет false, потому что сериализованные данные всегда представлены в виде строк.

Важно помнить, что функция не проверяет корректность сериализованной строки. Если она повреждена, функция может всё равно определить её как сериализованную.

Параметры функции

  • $data (string) (обязательный): значение, которое нужно проверить на сериализацию.
  • $strict (bool): определяет, насколько строгой должна быть проверка конца строки. Если этот параметр равен true, строка должна заканчиваться символом ; или }.
    • По умолчанию: true

Возвращаемое значение

Функция возвращает:

  • true, если строка сериализована.
  • false, если строка не сериализована.

Примеры использования

Проверка сериализованной строки

Предположим, у нас есть сериализованная строка из массива:

is_serialized('a:1:{s:3:"foo";s:3:"bar";}'); //> true

Проверка с поврежденным концом

Функция не проверяет конец строки, поэтому:

is_serialized('a:1:{s:3:"foo";s:3:"bar";'); //> true

Пример не сериализованных данных

Для обычной строки функция вернет false:

is_serialized('hello world'); //> false

Неправильный формат

Если передать массив, функция также вернет false:

is_serialized(array('foo')); //> false

Код функции

Ниже приведен код функции is_serialized():


function is_serialized( $data, $strict = true ) {
// Если это не строка, значит, это не сериализовано.
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, '}' );
// Должен быть либо ;, либо }.
if ( false === $semicolon && false === $brace ) {
return false;
}
// Но ни одно из них не должно быть на первых X символах.
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 ( ! str_contains( $data, '"' ) ) {
return false;
}
case 'a':
case 'O':
case 'E':
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;
}

Изменения в версии

  • С 2.0.5: Функция была введена.
  • С 6.1.0: Добавлена поддержка перечислений.

Функция is_serialized() позволяет быстро и удобно проверять, являются ли данные сериализованными. Она полезна в различных ситуациях, когда необходимо управлять и хранить данные в формате сериала.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *