Як перевірити, чи серіалізований рядок у PHP

Сніппет

Декілька способів перевірити, чи є рядок серіалізованим об'єктом/масивом або просто рядком:

downloadcopy
<?php
/**
 * Перевірка, чи серіалізований рядок
 *
 * @param string $string
 *
 * @return bool
 */
function isSerialized($string) {
    return (@unserialize($string) !== false || $string == 'b:0;');
}

// використання
$string = 'a:1:{s:7:"website";a:2:{s:6:"domain";s:9:"wtools.io";s:5:"title";s:16:"Online Web Tools";}}';
if(isSerialized($string)!==false){
    echo "це серіалізований рядок";
} else {
    echo "не серіалізований рядок";
}

Ось ще WordPress рішення: (джерело тут)

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

// использование
$string = 'a:1:{s:7:"website";a:2:{s:6:"domain";s:9:"wtools.io";s:5:"title";s:16:"Online Web Tools";}}';
if(is_serialized($string)!==false){
    echo "це серіалізований рядок";
} else {
    echo "не серіалізований рядок";
}