Created
March 17, 2015 02:46
-
-
Save aaroneaton/351c4b0dd96bd1ff520e to your computer and use it in GitHub Desktop.
is_serialized
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * Check value to find if it was serialized. | |
| * | |
| * If $data is not an string, then returned value will always be false. | |
| * Serialized data is always a string. | |
| * | |
| * @since 2.0.5 | |
| * | |
| * @param string $data Value to check to see if was serialized. | |
| * @param bool $strict Optional. Whether to be strict about the end of the string. Default true. | |
| * @return bool False if not serialized and true if it was. | |
| */ | |
| 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; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment