Created
September 30, 2015 00:56
-
-
Save victordit/8583ddcfbc82bc90d06a to your computer and use it in GitHub Desktop.
Check value to find if it was serialized
This file contains 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. | |
* | |
* @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. | |
*/ | |
public 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