3v4l.org

run code in 500+ PHP versions simultaneously
<?php /* * Polyfills. */ function stripslashes_from_strings_only( $value ) { return is_string( $value ) ? stripslashes( $value ) : $value; } 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': case 'E': 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; } function map_deep( $value, $callback ) { if ( is_array( $value ) ) { foreach ( $value as $index => $item ) { $value[ $index ] = map_deep( $item, $callback ); } } elseif ( is_object( $value ) ) { $object_vars = get_object_vars( $value ); foreach ( $object_vars as $property_name => $property_value ) { $value->$property_name = map_deep( $property_value, $callback ); } } else { $value = call_user_func( $callback, $value ); } return $value; } function maybe_unserialize( $data ) { if ( is_serialized( $data ) ) { // Don't attempt to unserialize data that wasn't serialized going in. return @unserialize( trim( $data ) ); } return $data; } /* * Test. */ $test_data = 'a:2:{i:0;O:14:"SuperCustomXyz":1:{s:17:" SuperCustomXyz x";s:4:"test";}s:8:"testdata";a:2:{s:1:"a";i:1;s:1:"b";i:2;}}'; $unserialized = maybe_unserialize($test_data); $res = map_deep($unserialized, 'stripslashes_from_strings_only'); print_r($res);
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/WJiN0
function name:  (null)
number of ops:  14
compiled vars:  !0 = $test_data, !1 = $unserialized, !2 = $res
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
   98     0  E >   ASSIGN                                                       !0, 'a%3A2%3A%7Bi%3A0%3BO%3A14%3A%22SuperCustomXyz%22%3A1%3A%7Bs%3A17%3A%22+SuperCustomXyz+x%22%3Bs%3A4%3A%22test%22%3B%7Ds%3A8%3A%22testdata%22%3Ba%3A2%3A%7Bs%3A1%3A%22a%22%3Bi%3A1%3Bs%3A1%3A%22b%22%3Bi%3A2%3B%7D%7D'
   99     1        INIT_FCALL                                                   'maybe_unserialize'
          2        SEND_VAR                                                     !0
          3        DO_FCALL                                          0  $4      
          4        ASSIGN                                                       !1, $4
  100     5        INIT_FCALL                                                   'map_deep'
          6        SEND_VAR                                                     !1
          7        SEND_VAL                                                     'stripslashes_from_strings_only'
          8        DO_FCALL                                          0  $6      
          9        ASSIGN                                                       !2, $6
  101    10        INIT_FCALL                                                   'print_r'
         11        SEND_VAR                                                     !2
         12        DO_ICALL                                                     
         13      > RETURN                                                       1

Function stripslashes_from_strings_only:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 3, Position 2 = 8
Branch analysis from position: 3
1 jumps found. (Code = 42) Position 1 = 9
Branch analysis from position: 9
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 8
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/WJiN0
function name:  stripslashes_from_strings_only
number of ops:  11
compiled vars:  !0 = $value
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
    6     0  E >   RECV                                                 !0      
    7     1        TYPE_CHECK                                       64          !0
          2      > JMPZ                                                         ~1, ->8
          3    >   INIT_FCALL                                                   'stripslashes'
          4        SEND_VAR                                                     !0
          5        DO_ICALL                                             $2      
          6        QM_ASSIGN                                            ~3      $2
          7      > JMP                                                          ->9
          8    >   QM_ASSIGN                                            ~3      !0
          9    > > RETURN                                                       ~3
    8    10*     > RETURN                                                       null

End of function stripslashes_from_strings_only

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

End of function is_serialized

Function map_deep:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 4, Position 2 = 16
Branch analysis from position: 4
2 jumps found. (Code = 77) Position 1 = 5, Position 2 = 14
Branch analysis from position: 5
2 jumps found. (Code = 78) Position 1 = 6, Position 2 = 14
Branch analysis from position: 6
1 jumps found. (Code = 42) Position 1 = 5
Branch analysis from position: 5
Branch analysis from position: 14
1 jumps found. (Code = 42) Position 1 = 38
Branch analysis from position: 38
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 14
Branch analysis from position: 16
2 jumps found. (Code = 43) Position 1 = 18, Position 2 = 34
Branch analysis from position: 18
2 jumps found. (Code = 77) Position 1 = 23, Position 2 = 32
Branch analysis from position: 23
2 jumps found. (Code = 78) Position 1 = 24, Position 2 = 32
Branch analysis from position: 24
1 jumps found. (Code = 42) Position 1 = 23
Branch analysis from position: 23
Branch analysis from position: 32
1 jumps found. (Code = 42) Position 1 = 38
Branch analysis from position: 38
Branch analysis from position: 32
Branch analysis from position: 34
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/WJiN0
function name:  map_deep
number of ops:  40
compiled vars:  !0 = $value, !1 = $callback, !2 = $item, !3 = $index, !4 = $object_vars, !5 = $property_value, !6 = $property_name
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
   70     0  E >   RECV                                                 !0      
          1        RECV                                                 !1      
   71     2        TYPE_CHECK                                      128          !0
          3      > JMPZ                                                         ~7, ->16
   72     4    > > FE_RESET_R                                           $8      !0, ->14
          5    > > FE_FETCH_R                                           ~9      $8, !2, ->14
          6    >   ASSIGN                                                       !3, ~9
   73     7        INIT_FCALL_BY_NAME                                           'map_deep'
          8        SEND_VAR_EX                                                  !2
          9        SEND_VAR_EX                                                  !1
         10        DO_FCALL                                          0  $12     
         11        ASSIGN_DIM                                                   !0, !3
         12        OP_DATA                                                      $12
   72    13      > JMP                                                          ->5
         14    >   FE_FREE                                                      $8
   71    15      > JMP                                                          ->38
   75    16    >   TYPE_CHECK                                      256          !0
         17      > JMPZ                                                         ~13, ->34
   76    18    >   INIT_FCALL                                                   'get_object_vars'
         19        SEND_VAR                                                     !0
         20        DO_ICALL                                             $14     
         21        ASSIGN                                                       !4, $14
   77    22      > FE_RESET_R                                           $16     !4, ->32
         23    > > FE_FETCH_R                                           ~17     $16, !5, ->32
         24    >   ASSIGN                                                       !6, ~17
   78    25        INIT_FCALL_BY_NAME                                           'map_deep'
         26        SEND_VAR_EX                                                  !5
         27        SEND_VAR_EX                                                  !1
         28        DO_FCALL                                          0  $20     
         29        ASSIGN_OBJ                                                   !0, !6
         30        OP_DATA                                                      $20
   77    31      > JMP                                                          ->23
         32    >   FE_FREE                                                      $16
   75    33      > JMP                                                          ->38
   81    34    >   INIT_USER_CALL                                    1          'call_user_func', !1
         35        SEND_USER                                                    !0
         36        DO_FCALL                                          0  $21     
         37        ASSIGN                                                       !0, $21
   84    38    > > RETURN                                                       !0
   85    39*     > RETURN                                                       null

End of function map_deep

Function maybe_unserialize:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 5, Position 2 = 12
Branch analysis from position: 5
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 12
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/WJiN0
function name:  maybe_unserialize
number of ops:  14
compiled vars:  !0 = $data
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
   87     0  E >   RECV                                                 !0      
   88     1        INIT_FCALL                                                   'is_serialized'
          2        SEND_VAR                                                     !0
          3        DO_FCALL                                          0  $1      
          4      > JMPZ                                                         $1, ->12
   89     5    >   BEGIN_SILENCE                                        ~2      
          6        INIT_FCALL                                                   'unserialize'
          7        FRAMELESS_ICALL_1                trim                ~3      !0
          8        SEND_VAL                                                     ~3
          9        DO_ICALL                                             $4      
         10        END_SILENCE                                                  ~2
         11      > RETURN                                                       $4
   92    12    > > RETURN                                                       !0
   93    13*     > RETURN                                                       null

End of function maybe_unserialize

Generated using Vulcan Logic Dumper, using php 8.5.0


preferences:
178.13 ms | 3577 KiB | 20 Q