Advertisement
Guest User

is_valid_json.php

a guest
Aug 2nd, 2022
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.87 KB | None | 0 0
  1. <?php
  2.  
  3. function is_valid_json( $mixed ) {
  4.     if ( ! is_string( $mixed ) ) {
  5.         return false;
  6.     }
  7.  
  8.     return false !== parse_json_text( $mixed, 0 );
  9. }
  10.  
  11. function parse_json_text( $input, $at ) {
  12.     $at = skip_ws( $input, $at );
  13.     $at = parse_value( $input, $at );
  14.     if ( ! $at ) {
  15.         return false;
  16.     }
  17.     $at = skip_ws( $input, $at );
  18.  
  19.     return $at = strlen( $input );
  20. }
  21.  
  22. function parse_value( $input, $at ) {
  23.     switch ( $input[ $at ] ) {
  24.         case '[':
  25.             return parse_array( $input, $at );
  26.  
  27.         case '{':
  28.             return parse_object( $input, $at );
  29.  
  30.         case '"':
  31.             return parse_string( $input, $at );
  32.     }
  33.  
  34.     if ( 1 === preg_match( '~false|null|true~As', $input, $literal, 0, $at ) ) {
  35.         return $at + strlen( $literal[0] );
  36.     }
  37.  
  38.     return parse_number( $input, $at );
  39. }
  40.  
  41. function parse_array( $input, $at ) {
  42.     if ( '[' !== $input[ $at++ ] ) {
  43.         return false;
  44.     }
  45.     $at = skip_ws( $input, $at );
  46.  
  47.     if ( ']' === $input[ $at ] ) {
  48.         return $at + 1;
  49.     }
  50.  
  51.     $at = parse_value( $input, $at );
  52.     if ( false === $at ) {
  53.         return false;
  54.     }
  55.  
  56.     while ( true ) {
  57.         $at = skip_ws( $input, $at );
  58.         switch ( $input[ $at ] ) {
  59.             case ']':
  60.                 return $at + 1;
  61.  
  62.             case ',':
  63.                 $at++;
  64.                 break;
  65.  
  66.             default:
  67.                 return false;
  68.         }
  69.  
  70.         $at = skip_ws( $input, $at );
  71.         $at = parse_value( $input, $at );
  72.         if ( false === $at ) {
  73.             return false;
  74.         }
  75.     }
  76. }
  77.  
  78. function parse_object( $input, $at ) {
  79.     if ( '{' !== $input[ $at++ ] ) {
  80.         return false;
  81.     }
  82.  
  83.     $at = skip_ws( $input, $at );
  84.     if ( '}' === $input[ $at ] ) {
  85.         return $at + 1;
  86.     }
  87.  
  88.     $at = parse_string( $input, $at );
  89.     if ( false === $at ) {
  90.         return false;
  91.     }
  92.     $at = skip_ws( $input, $at );
  93.  
  94.     if ( ':' !== $input[ $at++ ] ) {
  95.         return false;
  96.     }
  97.     $at = skip_ws( $input, $at );
  98.  
  99.     $at = parse_value( $input, $at );
  100.     if ( false === $at ) {
  101.         return false;
  102.     }
  103.  
  104.     while ( true ) {
  105.         $at = skip_ws( $input, $at );
  106.  
  107.         switch ( $input[ $at ] ) {
  108.             case '}':
  109.                 return $at + 1;
  110.  
  111.             case ',':
  112.                 $at++;
  113.                 break;
  114.  
  115.             default:
  116.                 return false;
  117.         }
  118.  
  119.         $at = skip_ws( $input, $at );
  120.         $at = parse_string( $input, $at );
  121.         if ( false === $at ) {
  122.             return false;
  123.         }
  124.         $at = skip_ws( $input, $at );
  125.         if ( ':' !== $input[ $at++ ] ) {
  126.             return false;
  127.         }
  128.         $at = skip_ws( $input, $at );
  129.         $at = parse_value( $input, $at );
  130.         if ( false === $at ) {
  131.             return false;
  132.         }
  133.     }
  134. }
  135.  
  136. function parse_number( $input, $at ) {
  137.     if ( 1 !== preg_match( '~\-?(?:[1-9][0-9]*|0)(?:\.[0-9]+)?(?:[eE][-+]?[0-9]+)?~As', $input, $number, 0, $at ) ) {
  138.         return false;
  139.     }
  140.  
  141.     return $at + strlen( $number[0] );
  142. }
  143.  
  144. function parse_string( $input, $at ) {
  145.     if ( 1 !== preg_match( '~"(?:\\"|.)*?"~As', $input, $string, 0, $at ) ) {
  146.         return false;
  147.     }
  148.  
  149.     return $at + strlen( $string[0] );
  150. }
  151.  
  152. function skip_ws( $input, $at ) {
  153.     preg_match( '~[\x{20}\x{09}\x{0a}\x{0d}]*~As', $input, $ws, 0, $at );
  154.     return $at + strlen( $ws[0] );
  155. }
  156.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement