3v4l.org

run code in 500+ PHP versions simultaneously
<?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; } /** * Check whether serialized data is of string type. * * @since 2.0.5 * * @param string $data Serialized data. * @return bool False if not a serialized string, true if it is. */ function is_serialized_string( $data ) { // if it isn't a string, it isn't a serialized string. if ( ! is_string( $data ) ) { return false; } $data = trim( $data ); if ( strlen( $data ) < 4 ) { return false; } elseif ( ':' !== $data[1] ) { return false; } elseif ( ';' !== substr( $data, -1 ) ) { return false; } elseif ( $data[0] !== 's' ) { return false; } elseif ( '"' !== substr( $data, -2, 1 ) ) { return false; } else { return true; } } var_dump( is_serialized( serialize(NULL) ) ); // true var_dump( is_serialized_string( serialize(NULL) ) ); // false var_dump( is_serialized( serialize(array(1,2,3)) ) ); // true var_dump( is_serialized_string( serialize(array(1,2,3)) ) ); // false var_dump( is_serialized( serialize("hello") ) ); // true var_dump( is_serialized_string( serialize("hello") ) ); // false
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/iqgnf
function name:  (null)
number of ops:  55
compiled vars:  none
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
  100     0  E >   INIT_FCALL                                                   'var_dump'
          1        INIT_FCALL                                                   'is_serialized'
          2        INIT_FCALL                                                   'serialize'
          3        SEND_VAL                                                     null
          4        DO_ICALL                                             $0      
          5        SEND_VAR                                                     $0
          6        DO_FCALL                                          0  $1      
          7        SEND_VAR                                                     $1
          8        DO_ICALL                                                     
  101     9        INIT_FCALL                                                   'var_dump'
         10        INIT_FCALL                                                   'is_serialized_string'
         11        INIT_FCALL                                                   'serialize'
         12        SEND_VAL                                                     null
         13        DO_ICALL                                             $3      
         14        SEND_VAR                                                     $3
         15        DO_FCALL                                          0  $4      
         16        SEND_VAR                                                     $4
         17        DO_ICALL                                                     
  103    18        INIT_FCALL                                                   'var_dump'
         19        INIT_FCALL                                                   'is_serialized'
         20        INIT_FCALL                                                   'serialize'
         21        SEND_VAL                                                     <array>
         22        DO_ICALL                                             $6      
         23        SEND_VAR                                                     $6
         24        DO_FCALL                                          0  $7      
         25        SEND_VAR                                                     $7
         26        DO_ICALL                                                     
  104    27        INIT_FCALL                                                   'var_dump'
         28        INIT_FCALL                                                   'is_serialized_string'
         29        INIT_FCALL                                                   'serialize'
         30        SEND_VAL                                                     <array>
         31        DO_ICALL                                             $9      
         32        SEND_VAR                                                     $9
         33        DO_FCALL                                          0  $10     
         34        SEND_VAR                                                     $10
         35        DO_ICALL                                                     
  106    36        INIT_FCALL                                                   'var_dump'
         37        INIT_FCALL                                                   'is_serialized'
         38        INIT_FCALL                                                   'serialize'
         39        SEND_VAL                                                     'hello'
         40        DO_ICALL                                             $12     
         41        SEND_VAR                                                     $12
         42        DO_FCALL                                          0  $13     
         43        SEND_VAR                                                     $13
         44        DO_ICALL                                                     
  107    45        INIT_FCALL                                                   'var_dump'
         46        INIT_FCALL                                                   'is_serialized_string'
         47        INIT_FCALL                                                   'serialize'
         48        SEND_VAL                                                     'hello'
         49        DO_ICALL                                             $15     
         50        SEND_VAR                                                     $15
         51        DO_FCALL                                          0  $16     
         52        SEND_VAR                                                     $16
         53        DO_ICALL                                                     
         54      > RETURN                                                       1

Function is_serialized:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 5, Position 2 = 6
Branch analysis from position: 5
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 6
2 jumps found. (Code = 43) Position 1 = 10, Position 2 = 11
Branch analysis from position: 10
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 11
2 jumps found. (Code = 43) Position 1 = 14, Position 2 = 15
Branch analysis from position: 14
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 15
2 jumps found. (Code = 43) Position 1 = 18, Position 2 = 19
Branch analysis from position: 18
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 19
2 jumps found. (Code = 43) Position 1 = 20, Position 2 = 29
Branch analysis from position: 20
2 jumps found. (Code = 46) Position 1 = 24, Position 2 = 26
Branch analysis from position: 24
2 jumps found. (Code = 43) Position 1 = 27, Position 2 = 28
Branch analysis from position: 27
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 28
1 jumps found. (Code = 42) Position 1 = 51
Branch analysis from position: 51
8 jumps found. (Code = 188) Position 1 = 67, Position 2 = 78, Position 3 = 78, Position 4 = 84, Position 5 = 84, Position 6 = 84, Position 7 = 97, Position 8 = 54
Branch analysis from position: 67
2 jumps found. (Code = 43) Position 1 = 68, Position 2 = 74
Branch analysis from position: 68
2 jumps found. (Code = 43) Position 1 = 72, Position 2 = 73
Branch analysis from position: 72
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 73
1 jumps found. (Code = 42) Position 1 = 78
Branch analysis from position: 78
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 74
2 jumps found. (Code = 43) Position 1 = 77, Position 2 = 78
Branch analysis from position: 77
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 78
Branch analysis from position: 78
Branch analysis from position: 78
Branch analysis from position: 84
2 jumps found. (Code = 43) Position 1 = 85, Position 2 = 87
Branch analysis from position: 85
1 jumps found. (Code = 42) Position 1 = 88
Branch analysis from position: 88
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 87
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 84
Branch analysis from position: 84
Branch analysis from position: 97
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 54
2 jumps found. (Code = 44) Position 1 = 56, Position 2 = 67
Branch analysis from position: 56
2 jumps found. (Code = 44) Position 1 = 58, Position 2 = 78
Branch analysis from position: 58
2 jumps found. (Code = 44) Position 1 = 60, Position 2 = 78
Branch analysis from position: 60
2 jumps found. (Code = 44) Position 1 = 62, Position 2 = 84
Branch analysis from position: 62
2 jumps found. (Code = 44) Position 1 = 64, Position 2 = 84
Branch analysis from position: 64
2 jumps found. (Code = 44) Position 1 = 66, Position 2 = 84
Branch analysis from position: 66
1 jumps found. (Code = 42) Position 1 = 97
Branch analysis from position: 97
Branch analysis from position: 84
Branch analysis from position: 84
Branch analysis from position: 84
Branch analysis from position: 78
Branch analysis from position: 78
Branch analysis from position: 67
Branch analysis from position: 26
Branch analysis from position: 29
2 jumps found. (Code = 46) Position 1 = 35, Position 2 = 37
Branch analysis from position: 35
2 jumps found. (Code = 43) Position 1 = 38, Position 2 = 39
Branch analysis from position: 38
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 39
2 jumps found. (Code = 46) Position 1 = 41, Position 2 = 43
Branch analysis from position: 41
2 jumps found. (Code = 43) Position 1 = 44, Position 2 = 45
Branch analysis from position: 44
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 45
2 jumps found. (Code = 46) Position 1 = 47, Position 2 = 49
Branch analysis from position: 47
2 jumps found. (Code = 43) Position 1 = 50, Position 2 = 51
Branch analysis from position: 50
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 51
Branch analysis from position: 49
Branch analysis from position: 43
Branch analysis from position: 37
filename:       /in/iqgnf
function name:  is_serialized
number of ops:  99
compiled vars:  !0 = $data, !1 = $strict, !2 = $lastc, !3 = $semicolon, !4 = $brace, !5 = $token, !6 = $end
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
   15     0  E >   RECV                                                 !0      
          1        RECV_INIT                                            !1      <true>
   17     2        TYPE_CHECK                                       64  ~7      !0
          3        BOOL_NOT                                             ~8      ~7
          4      > JMPZ                                                         ~8, ->6
   18     5    > > RETURN                                                       <false>
   20     6    >   FRAMELESS_ICALL_1                trim                ~9      !0
          7        ASSIGN                                                       !0, ~9
   21     8        IS_EQUAL                                                     !0, 'N%3B'
          9      > JMPZ                                                         ~11, ->11
   22    10    > > RETURN                                                       <true>
   24    11    >   STRLEN                                               ~12     !0
         12        IS_SMALLER                                                   ~12, 4
         13      > JMPZ                                                         ~13, ->15
   25    14    > > RETURN                                                       <false>
   27    15    >   FETCH_DIM_R                                          ~14     !0, 1
         16        IS_NOT_IDENTICAL                                             ~14, '%3A'
         17      > JMPZ                                                         ~15, ->19
   28    18    > > RETURN                                                       <false>
   30    19    > > JMPZ                                                         !1, ->29
   31    20    >   FRAMELESS_ICALL_2                substr              ~16     !0, -1
         21        ASSIGN                                                       !2, ~16
   32    22        IS_NOT_IDENTICAL                                     ~18     !2, '%3B'
         23      > JMPZ_EX                                              ~18     ~18, ->26
         24    >   IS_NOT_IDENTICAL                                     ~19     !2, '%7D'
         25        BOOL                                                 ~18     ~19
         26    > > JMPZ                                                         ~18, ->28
   33    27    > > RETURN                                                       <false>
   30    28    > > JMP                                                          ->51
   36    29    >   FRAMELESS_ICALL_2                strpos              ~20     !0, '%3B'
         30        ASSIGN                                                       !3, ~20
   37    31        FRAMELESS_ICALL_2                strpos              ~22     !0, '%7D'
         32        ASSIGN                                                       !4, ~22
   39    33        TYPE_CHECK                                        4  ~24     !3
         34      > JMPZ_EX                                              ~24     ~24, ->37
         35    >   TYPE_CHECK                                        4  ~25     !4
         36        BOOL                                                 ~24     ~25
         37    > > JMPZ                                                         ~24, ->39
   40    38    > > RETURN                                                       <false>
   42    39    >   TYPE_CHECK                                      1018  ~26     !3
         40      > JMPZ_EX                                              ~26     ~26, ->43
         41    >   IS_SMALLER                                           ~27     !3, 3
         42        BOOL                                                 ~26     ~27
         43    > > JMPZ                                                         ~26, ->45
   43    44    > > RETURN                                                       <false>
   44    45    >   TYPE_CHECK                                      1018  ~28     !4
         46      > JMPZ_EX                                              ~28     ~28, ->49
         47    >   IS_SMALLER                                           ~29     !4, 4
         48        BOOL                                                 ~28     ~29
         49    > > JMPZ                                                         ~28, ->51
   45    50    > > RETURN                                                       <false>
   47    51    >   FETCH_DIM_R                                          ~30     !0, 0
         52        ASSIGN                                                       !5, ~30
   48    53      > SWITCH_STRING                                                !5, [ 's':->67, 'a':->78, 'O':->78, 'b':->84, 'i':->84, 'd':->84, ], ->97
   49    54    >   IS_EQUAL                                                     !5, 's'
         55      > JMPNZ                                                        ~32, ->67
   58    56    >   IS_EQUAL                                                     !5, 'a'
         57      > JMPNZ                                                        ~32, ->78
   59    58    >   IS_EQUAL                                                     !5, 'O'
         59      > JMPNZ                                                        ~32, ->78
   61    60    >   IS_EQUAL                                                     !5, 'b'
         61      > JMPNZ                                                        ~32, ->84
   62    62    >   IS_EQUAL                                                     !5, 'i'
         63      > JMPNZ                                                        ~32, ->84
   63    64    >   IS_EQUAL                                                     !5, 'd'
         65      > JMPNZ                                                        ~32, ->84
         66    > > JMP                                                          ->97
   50    67    > > JMPZ                                                         !1, ->74
   51    68    >   FRAMELESS_ICALL_3                substr              ~33     !0, -2
         69        OP_DATA                                                      1
         70        IS_NOT_IDENTICAL                                             ~33, '%22'
         71      > JMPZ                                                         ~34, ->73
   52    72    > > RETURN                                                       <false>
   50    73    > > JMP                                                          ->78
   54    74    >   FRAMELESS_ICALL_2                strpos              ~35     !0, '%22'
         75        TYPE_CHECK                                        4          ~35
         76      > JMPZ                                                         ~36, ->78
   55    77    > > RETURN                                                       <false>
   60    78    >   ROPE_INIT                                         3  ~38     '%2F%5E'
         79        ROPE_ADD                                          1  ~38     ~38, !5
         80        ROPE_END                                          2  ~37     ~38, '%3A%5B0-9%5D%2B%3A%2Fs'
         81        FRAMELESS_ICALL_2                preg_match          ~40     ~37, !0
         82        BOOL                                                 ~41     ~40
         83      > RETURN                                                       ~41
   64    84    > > JMPZ                                                         !1, ->87
         85    >   QM_ASSIGN                                            ~42     '%24'
         86      > JMP                                                          ->88
         87    >   QM_ASSIGN                                            ~42     ''
         88    >   ASSIGN                                                       !6, ~42
   65    89        ROPE_INIT                                         5  ~45     '%2F%5E'
         90        ROPE_ADD                                          1  ~45     ~45, !5
         91        ROPE_ADD                                          2  ~45     ~45, '%3A%5B0-9.E-%5D%2B%3B'
         92        ROPE_ADD                                          3  ~45     ~45, !6
         93        ROPE_END                                          4  ~44     ~45, '%2F'
         94        FRAMELESS_ICALL_2                preg_match          ~48     ~44, !0
         95        BOOL                                                 ~49     ~48
         96      > RETURN                                                       ~49
   67    97    > > RETURN                                                       <false>
   68    98*     > RETURN                                                       null

End of function is_serialized

Function is_serialized_string:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 4, Position 2 = 5
Branch analysis from position: 4
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 5
2 jumps found. (Code = 43) Position 1 = 10, Position 2 = 12
Branch analysis from position: 10
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 12
2 jumps found. (Code = 43) Position 1 = 15, Position 2 = 17
Branch analysis from position: 15
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 17
2 jumps found. (Code = 43) Position 1 = 20, Position 2 = 22
Branch analysis from position: 20
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 22
2 jumps found. (Code = 43) Position 1 = 25, Position 2 = 27
Branch analysis from position: 25
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 27
2 jumps found. (Code = 43) Position 1 = 31, Position 2 = 33
Branch analysis from position: 31
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 33
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/iqgnf
function name:  is_serialized_string
number of ops:  35
compiled vars:  !0 = $data
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
   78     0  E >   RECV                                                 !0      
   80     1        TYPE_CHECK                                       64  ~1      !0
          2        BOOL_NOT                                             ~2      ~1
          3      > JMPZ                                                         ~2, ->5
   81     4    > > RETURN                                                       <false>
   83     5    >   FRAMELESS_ICALL_1                trim                ~3      !0
          6        ASSIGN                                                       !0, ~3
   84     7        STRLEN                                               ~5      !0
          8        IS_SMALLER                                                   ~5, 4
          9      > JMPZ                                                         ~6, ->12
   85    10    > > RETURN                                                       <false>
   84    11*       JMP                                                          ->34
   86    12    >   FETCH_DIM_R                                          ~7      !0, 1
         13        IS_NOT_IDENTICAL                                             ~7, '%3A'
         14      > JMPZ                                                         ~8, ->17
   87    15    > > RETURN                                                       <false>
   86    16*       JMP                                                          ->34
   88    17    >   FRAMELESS_ICALL_2                substr              ~9      !0, -1
         18        IS_NOT_IDENTICAL                                             ~9, '%3B'
         19      > JMPZ                                                         ~10, ->22
   89    20    > > RETURN                                                       <false>
   88    21*       JMP                                                          ->34
   90    22    >   FETCH_DIM_R                                          ~11     !0, 0
         23        IS_NOT_IDENTICAL                                             ~11, 's'
         24      > JMPZ                                                         ~12, ->27
   91    25    > > RETURN                                                       <false>
   90    26*       JMP                                                          ->34
   92    27    >   FRAMELESS_ICALL_3                substr              ~13     !0, -2
         28        OP_DATA                                                      1
         29        IS_NOT_IDENTICAL                                             ~13, '%22'
         30      > JMPZ                                                         ~14, ->33
   93    31    > > RETURN                                                       <false>
   92    32*       JMP                                                          ->34
   95    33    > > RETURN                                                       <true>
   97    34*     > RETURN                                                       null

End of function is_serialized_string

Generated using Vulcan Logic Dumper, using php 8.5.0


preferences:
178.12 ms | 2577 KiB | 21 Q