| Source for file JSON.phpDocumentation is available at JSON.php 
    // +----------------------------------------------------------------------+    // +----------------------------------------------------------------------+    // | Copyright (c) 2005 Michal Migurski                                   |    // +----------------------------------------------------------------------+    // | This source file is subject to version 3.0 of the PHP license,       |    // | that is bundled with this package in the file LICENSE, and is        |    // | available through the world-wide-web at the following url:           |    // | http://www.php.net/license/3_0.txt.                                  |    // | If you did not receive a copy of the PHP license and are unable to   |    // | obtain it through the world-wide-web, please send a note to          |    // | license@php.net so we can mail you a copy immediately.               |    // +----------------------------------------------------------------------+    // | Author: Michal Migurski, mike-json[at]teczno[dot]com                 |    // | with contributions from:                                             |    // |   Matt Knapp, mdknapp[at]gmail[dot]com                               |    // |   Brett Stimmerman, brettstimmerman[at]gmail[dot]com                 |    // +----------------------------------------------------------------------+    // $Id: HTML_AJAX_JSON.php,v 1.16 2005/06/19 00:46:05 migurski Exp $    /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */    define('HTML_AJAX_JSON_SLICE',   1) ;    define('HTML_AJAX_JSON_IN_STR',  2) ;    define('HTML_AJAX_JSON_IN_ARR',  4) ;    define('HTML_AJAX_JSON_IN_OBJ',  8) ;    define('HTML_AJAX_JSON_IN_CMT', 16) ;    define('HTML_AJAX_JSON_LOOSE_TYPE', 10) ;    define('HTML_AJAX_JSON_STRICT_TYPE', 11) ;    * Conversion to and from HTML_AJAX_JSON format.    * See http://json.org for details.    * note all strings should be in ASCII or UTF-8 format!       /** function HTML_AJAX_JSON        * @param    use     int     object behavior: when encoding or decoding,        *                            be loose or strict about object/array usage        *                               HTML_AJAX_JSON_STRICT_TYPE - strict typing, default        *                                                  "{...}" syntax creates objects in decode        *                                HTML_AJAX_JSON_LOOSE_TYPE - loose typing        *                                                  "{...}" syntax creates associative arrays in decode        function HTML_AJAX_JSON($use =HTML_AJAX_JSON_STRICT_TYPE)        * encode an arbitrary variable into HTML_AJAX_JSON format        * @param    var     mixed   any number, boolean, string, array, or object to be encoded.        *                            see argument 1 to HTML_AJAX_JSON() above for array-parsing behavior.        *                            if var is a strng, note that encode() always expects it        *                            to be in ASCII or UTF-8 format!        * @return   string  HTML_AJAX_JSON string representation of input var                    return $var ? 'true' : 'false' ;                case 'string' : // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT                    for($c = 0; $c < $strlen_var ; $c ++) {                        $ord_var_c = ord($var{$c}) ;                        } elseif($ord_var_c == 0x09) {                        } elseif($ord_var_c == 0x0A) {                        } elseif($ord_var_c == 0x0C) {                        } elseif($ord_var_c == 0x0D) {                        } elseif(($ord_var_c == 0x22) || ($ord_var_c == 0x2F) || ($ord_var_c == 0x5C)) {                            $ascii .= '\\' .$var{$c} ; // double quote, slash, slosh                        } elseif(($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)) {                            // characters U-00000000 - U-0000007F (same as ASCII)                            $ascii .= $var{$c} ; // most normal ASCII chars                        } elseif(($ord_var_c & 0xE0) == 0xC0) {                            // characters U-00000080 - U-000007FF, mask 110XXXXX, see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8                            $char = pack('C*', $ord_var_c, ord($var{$c +1})) ; $c +=1;                        } elseif(($ord_var_c & 0xF0) == 0xE0) {                            // characters U-00000800 - U-0000FFFF, mask 1110XXXX, see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8                            $char = pack('C*', $ord_var_c, ord($var{$c +1}), ord($var{$c +2})) ; $c +=2;                        } elseif(($ord_var_c & 0xF8) == 0xF0) {                            // characters U-00010000 - U-001FFFFF, mask 11110XXX, see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8                            $char = pack('C*', $ord_var_c, ord($var{$c +1}), ord($var{$c +2}), ord($var{$c +3})) ; $c +=3;                        } elseif(($ord_var_c & 0xFC) == 0xF8) {                            // characters U-00200000 - U-03FFFFFF, mask 111110XX, see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8                            $char = pack('C*', $ord_var_c, ord($var{$c +1}), ord($var{$c +2}), ord($var{$c +3}), ord($var{$c +4})) ; $c +=4;                        } elseif(($ord_var_c & 0xFE) == 0xFC) {                            // characters U-04000000 - U-7FFFFFFF, mask 1111110X, see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8                            $char = pack('C*', $ord_var_c, ord($var{$c +1}), ord($var{$c +2}), ord($var{$c +3}), ord($var{$c +4}), ord($var{$c +5})) ; $c +=5;                    // As per HTML_AJAX_JSON spec if any array key is not an integer we must treat the the whole array as an object.                     // We also try to catch a sparsely populated associative array with numeric keys here because some JS                     // engines will create an array with empty indexes up to max_index which can cause memory issues                     // and because the keys, which may be relevant, will be remapped otherwise.                    // As per the ECMA and HTML_AJAX_JSON specification an object may have any string as a property. Unfortunately due to a                     // hole in the ECMA specification if the key is a ECMA reserved word or starts with a digit the parameter is only                    // accessible using ECMAScript's bracket notation.                      // treat as a HTML_AJAX_JSON object                      // treat it like a regular array            return $this->encode($var) ;        * array-walking function for use in generating HTML_AJAX_JSON-formatted name-value pairs        * @param    name    string  name of key to use        * @param    value   mixed   reference to an array element to be encoded        * @return   string  HTML_AJAX_JSON-formatted name-value pair, like '"name":value'        function name_value($name, $value)            return (sprintf("%s:%s", $this->encode(strval($name)), $this-> encode($value))) ;       /** function reduce_string        * reduce a string by removing leading and trailing comments and whitespace        * @param    str     string      string value to strip of comments and whitespace        * @return   string  string value stripped of comments and whitespace        function reduce_string($str)            $str = preg_replace('#^\s*//(.+)$#m', '', $str) ; // eliminate single line comments in '// ...' form            $str = preg_replace('#^\s*/\*(.+)\*/#Us', '', $str) ; // eliminate multi-line comments in '/* ... */' form, at start of string            $str = preg_replace('#/\*(.+)\*/\s*$#Us', '', $str) ; // eliminate multi-line comments in '/* ... */' form, at end of string            $str = trim($str) ; // eliminate extraneous space        * decode a HTML_AJAX_JSON string into appropriate variable        * @param    str     string  HTML_AJAX_JSON-formatted string        * @return   mixed   number, boolean, string, array, or object        *                    corresponding to given HTML_AJAX_JSON input string.        *                    see argument 1 to HTML_AJAX_JSON() above for object-output behavior.        *                    note that decode() always returns strings        *                    in ASCII or UTF-8 format!            $str = $this-> reduce_string($str) ;                    if(is_numeric($str)) { // Lookie-loo, it's a number                        // return (float)$str; // This would work on its own, but I'm trying to be good about returning integers where appropriate                        return ((float)$str == (integer)$str)                    } elseif(preg_match('/^".+"$/s', $str) || preg_match('/^\'.+\'$/s', $str)) { // STRINGS RETURNED IN UTF-8 FORMAT                        for($c = 0; $c < $strlen_chrs ; $c ++) {                            $substr_chrs_c_2 = substr($chrs, $c, 2) ;                            $ord_chrs_c = ord($chrs{$c}) ;                            if($substr_chrs_c_2 == '\b') {                                $utf8 .= chr( 0x08) ; $c +=1;                            } elseif($substr_chrs_c_2 == '\t') {                                $utf8 .= chr( 0x09) ; $c +=1;                            } elseif($substr_chrs_c_2 == '\n') {                                $utf8 .= chr( 0x0A) ; $c +=1;                            } elseif($substr_chrs_c_2 == '\f') {                                $utf8 .= chr( 0x0C) ; $c +=1;                            } elseif($substr_chrs_c_2 == '\r') {                                $utf8 .= chr( 0x0D) ; $c +=1;                            } elseif(($delim == '"') && (($substr_chrs_c_2 == '\\"') || ($substr_chrs_c_2 == '\\\\') || ($substr_chrs_c_2 == '\\/'))) {                            } elseif(($delim == "'") && (($substr_chrs_c_2 == '\\\'') || ($substr_chrs_c_2 == '\\\\') || ($substr_chrs_c_2 == '\\/'))) {                            } elseif(preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6))) { // single, escaped unicode character                            } elseif(($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F)) {                            } elseif(($ord_chrs_c & 0xE0) == 0xC0) {                                // characters U-00000080 - U-000007FF, mask 110XXXXX, see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8                                $utf8 .= substr($chrs, $c, 2) ; $c += 1;                            } elseif(($ord_chrs_c & 0xF0) == 0xE0) {                                // characters U-00000800 - U-0000FFFF, mask 1110XXXX, see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8                                $utf8 .= substr($chrs, $c, 3) ; $c += 2;                            } elseif(($ord_chrs_c & 0xF8) == 0xF0) {                                // characters U-00010000 - U-001FFFFF, mask 11110XXX, see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8                                $utf8 .= substr($chrs, $c, 4) ; $c += 3;                            } elseif(($ord_chrs_c & 0xFC) == 0xF8) {                                // characters U-00200000 - U-03FFFFFF, mask 111110XX, see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8                                $utf8 .= substr($chrs, $c, 5) ; $c += 4;                            } elseif(($ord_chrs_c & 0xFE) == 0xFC) {                                // characters U-04000000 - U-7FFFFFFF, mask 1111110X, see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8                                $utf8 .= substr($chrs, $c, 6) ; $c += 5;                    } elseif(preg_match('/^\[.*\]$/s', $str) || preg_match('/^{.*}$/s', $str)) { // array, or object notation                        $chrs = $this-> reduce_string($chrs) ;                        //print("\nparsing {$chrs}\n");                        for($c = 0; $c <= $strlen_chrs ; $c ++) {                            $substr_chrs_c_2 = substr($chrs, $c, 2) ;                            if(($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == HTML_AJAX_JSON_SLICE))) { // found a comma that is not inside a string, array, etc., OR we've reached the end of the character list                                $slice = substr($chrs, $top['where'], ($c - $top['where'])) ;                                //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");                                } elseif(reset($stk) == HTML_AJAX_JSON_IN_OBJ) { // we are in an object, so figure out the property name and set an element in an associative array, for now                                    if(preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { // "name":value pair                                        $key = $this-> decode($parts[ 1]) ;                                        $val = $this-> decode($parts[ 2]) ;                                    } elseif(preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { // name:value pair, where name is unquoted                                        $val = $this-> decode($parts[ 2]) ;                            } elseif((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != HTML_AJAX_JSON_IN_STR)) { // found a quote, and we are not inside a string                                //print("Found start of string at {$c}\n");                            } elseif(($chrs{$c} == $top['delim']) && ($top['what'] == HTML_AJAX_JSON_IN_STR) && (($chrs{$c - 1} != "\\") || ($chrs{$c - 1} == "\\" && $chrs{$c - 2} == "\\"))) { // found a quote, we're in a string, and it's not escaped                                //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");                                //print("Found start of array at {$c}\n");                            } elseif(($chrs{$c} == ']') && ($top['what'] == HTML_AJAX_JSON_IN_ARR)) { // found a right-bracket, and we're in an array                                //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");                                //print("Found start of object at {$c}\n");                            } elseif(($chrs{$c} == '}') && ($top['what'] == HTML_AJAX_JSON_IN_OBJ)) { // found a right-brace, and we're in an object                                //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");                                //print("Found start of comment at {$c}\n");                            } elseif(($substr_chrs_c_2 == '*/') && ($top['what'] == HTML_AJAX_JSON_IN_CMT)) { // found a comment end, and we're in one now                                for($i = $top['where'] ; $i <= $c ; $i ++)                                //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");            return $this->decode($var) ;
		    
 
		    Documentation generated on Mon, 11 Mar 2019 14:11:19 -0400 by phpDocumentor 1.4.4 . PEAR Logo Copyright ©  PHP Group 2004.
	       |