检查一个字符串是否被序列化?

确定一个字符串是否是serialize()函数的结果/输出的最佳方法是什么?


我会说,试着去反unserialize它;-)

引用手册:

如果传递的字符串不是反序列化的,则返回FALSE并发出E_NOTICE。

所以,你必须检查返回值是否为false (使用===!== ,确保没有任何问题, 0null或任何等于false东西,我会说)。

请注意通知:您可能需要/需要使用@运算符。

例如 :

$str = 'hjkl';
$data = @unserialize($str);
if ($data !== false) {
    echo "ok";
} else {
    echo "not ok";
}

会得到你:

not ok


编辑:噢,像@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;
}

优化Pascal MARTIN的回应

/**
 * Check if a string is serialized
 * @param string $string
 */
public static function is_serial($string) {
    return (@unserialize($string) !== false);
}
链接地址: http://www.djcxy.com/p/74145.html

上一篇: Check to see if a string is serialized?

下一篇: Pass a PHP string to a JavaScript variable (and escape newlines)