Skip to content

Instantly share code, notes, and snippets.

@victordit
Created September 30, 2015 00:56
Show Gist options
  • Save victordit/8583ddcfbc82bc90d06a to your computer and use it in GitHub Desktop.
Save victordit/8583ddcfbc82bc90d06a to your computer and use it in GitHub Desktop.
Check value to find if it was serialized
<?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