Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- function is_valid_json( $mixed ) {
- if ( ! is_string( $mixed ) ) {
- return false;
- }
- return false !== parse_json_text( $mixed, 0 );
- }
- function parse_json_text( $input, $at ) {
- $at = skip_ws( $input, $at );
- $at = parse_value( $input, $at );
- if ( ! $at ) {
- return false;
- }
- $at = skip_ws( $input, $at );
- return $at = strlen( $input );
- }
- function parse_value( $input, $at ) {
- switch ( $input[ $at ] ) {
- case '[':
- return parse_array( $input, $at );
- case '{':
- return parse_object( $input, $at );
- case '"':
- return parse_string( $input, $at );
- }
- if ( 1 === preg_match( '~false|null|true~As', $input, $literal, 0, $at ) ) {
- return $at + strlen( $literal[0] );
- }
- return parse_number( $input, $at );
- }
- function parse_array( $input, $at ) {
- if ( '[' !== $input[ $at++ ] ) {
- return false;
- }
- $at = skip_ws( $input, $at );
- if ( ']' === $input[ $at ] ) {
- return $at + 1;
- }
- $at = parse_value( $input, $at );
- if ( false === $at ) {
- return false;
- }
- while ( true ) {
- $at = skip_ws( $input, $at );
- switch ( $input[ $at ] ) {
- case ']':
- return $at + 1;
- case ',':
- $at++;
- break;
- default:
- return false;
- }
- $at = skip_ws( $input, $at );
- $at = parse_value( $input, $at );
- if ( false === $at ) {
- return false;
- }
- }
- }
- function parse_object( $input, $at ) {
- if ( '{' !== $input[ $at++ ] ) {
- return false;
- }
- $at = skip_ws( $input, $at );
- if ( '}' === $input[ $at ] ) {
- return $at + 1;
- }
- $at = parse_string( $input, $at );
- if ( false === $at ) {
- return false;
- }
- $at = skip_ws( $input, $at );
- if ( ':' !== $input[ $at++ ] ) {
- return false;
- }
- $at = skip_ws( $input, $at );
- $at = parse_value( $input, $at );
- if ( false === $at ) {
- return false;
- }
- while ( true ) {
- $at = skip_ws( $input, $at );
- switch ( $input[ $at ] ) {
- case '}':
- return $at + 1;
- case ',':
- $at++;
- break;
- default:
- return false;
- }
- $at = skip_ws( $input, $at );
- $at = parse_string( $input, $at );
- if ( false === $at ) {
- return false;
- }
- $at = skip_ws( $input, $at );
- if ( ':' !== $input[ $at++ ] ) {
- return false;
- }
- $at = skip_ws( $input, $at );
- $at = parse_value( $input, $at );
- if ( false === $at ) {
- return false;
- }
- }
- }
- function parse_number( $input, $at ) {
- if ( 1 !== preg_match( '~\-?(?:[1-9][0-9]*|0)(?:\.[0-9]+)?(?:[eE][-+]?[0-9]+)?~As', $input, $number, 0, $at ) ) {
- return false;
- }
- return $at + strlen( $number[0] );
- }
- function parse_string( $input, $at ) {
- if ( 1 !== preg_match( '~"(?:\\"|.)*?"~As', $input, $string, 0, $at ) ) {
- return false;
- }
- return $at + strlen( $string[0] );
- }
- function skip_ws( $input, $at ) {
- preg_match( '~[\x{20}\x{09}\x{0a}\x{0d}]*~As', $input, $ws, 0, $at );
- return $at + strlen( $ws[0] );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement