Ответы в темах

Просмотр 3 ответов — с 1 по 3 (всего 3)
  • Сергей, так понял, что «сериализационная война» за самый лучший патч длится уже долго. И официальный победоносный багфикс ждать ещё долго.

    Было сделано 3 исправления.
    Строки:

    11:
    Было
    if ( ':' !== $data[1] )
    Стало
    if ( ':' !== substr($data,1,1) )

    14:
    Было
    $lastc = $data[ $length - 1 ];
    Стало
    $lastc = substr($data,$length-1,1);

    33:
    Было
    if ( '"' !== $data[ $length - 2 ] )
    Стало
    if ( '"' !== substr( $data,$length-2,1 ) )

    Изменил функцию на такую. Т.е. в некоторых местах, где работа со символами производилась как с массивом, реализовал через строковые функции. В итоге всё заработало! Пишем разработчикам, чтобы исправляли скорее баг!

    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;
    	$length = strlen( $data );
    	if ( $length < 4 )
    		return false;
    	if ( ':' !== substr($data,1,1) )
    		return false;
    	if ( $strict ) {
    		$lastc = substr($data,$length-1,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,$length-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;
    }
Просмотр 3 ответов — с 1 по 3 (всего 3)