Example #1
0
 /**
  * Decodes a JSON string
  * @see http://www.php.net/json_decode
  * @extracted from PEAR::Services_JSON
  */
 static function json_decode($str)
 {
     $str = preg_replace(array('#^\\s*//(.+)$#m', '#^\\s*/\\*(.+)\\*/#Us', '#/\\*(.+)\\*/\\s*$#Us'), '', $str);
     $str = trim($str);
     switch (strtolower($str)) {
         case 'true':
             return true;
         case 'false':
             return false;
         case 'null':
             return null;
         default:
             $m = array();
             if (is_numeric($str)) {
                 return (double) $str == (int) $str ? (int) $str : (double) $str;
             } elseif (preg_match('/^("|\').*(\\1)$/s', $str, $m) && $m[1] == $m[2]) {
                 $delim = substr($str, 0, 1);
                 $chrs = substr($str, 1, -1);
                 $utf8 = '';
                 $strlen_chrs = strlen($chrs);
                 for ($c = 0; $c < $strlen_chrs; ++$c) {
                     $substr_chrs_c_2 = substr($chrs, $c, 2);
                     $ord_chrs_c = ord($chrs[$c]);
                     switch (true) {
                         case $substr_chrs_c_2 == '\\b':
                             $utf8 .= chr(0x8);
                             ++$c;
                             break;
                         case $substr_chrs_c_2 == '\\t':
                             $utf8 .= chr(0x9);
                             ++$c;
                             break;
                         case $substr_chrs_c_2 == '\\n':
                             $utf8 .= chr(0xa);
                             ++$c;
                             break;
                         case $substr_chrs_c_2 == '\\f':
                             $utf8 .= chr(0xc);
                             ++$c;
                             break;
                         case $substr_chrs_c_2 == '\\r':
                             $utf8 .= chr(0xd);
                             ++$c;
                             break;
                         case $substr_chrs_c_2 == '\\"':
                         case $substr_chrs_c_2 == '\\\'':
                         case $substr_chrs_c_2 == '\\\\':
                         case $substr_chrs_c_2 == '\\/':
                             if ($delim == '"' && $substr_chrs_c_2 != '\\\'' || $delim == "'" && $substr_chrs_c_2 != '\\"') {
                                 $utf8 .= $chrs[++$c];
                             }
                             break;
                         case preg_match('/\\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
                             // single, escaped unicode character
                             $utf16 = chr(hexdec(substr($chrs, $c + 2, 2))) . chr(hexdec(substr($chrs, $c + 4, 2)));
                             $utf8 .= $this->utf162utf8($utf16);
                             $c += 5;
                             break;
                         case $ord_chrs_c >= 0x20 && $ord_chrs_c <= 0x7f:
                             $utf8 .= $chrs[$c];
                             break;
                         case ($ord_chrs_c & 0xe0) == 0xc0:
                             // characters U-00000080 - U-000007FF, mask 110XXXXX
                             $utf8 .= substr($chrs, $c, 2);
                             ++$c;
                             break;
                         case ($ord_chrs_c & 0xf0) == 0xe0:
                             // characters U-00000800 - U-0000FFFF, mask 1110XXXX
                             $utf8 .= substr($chrs, $c, 3);
                             $c += 2;
                             break;
                         case ($ord_chrs_c & 0xf8) == 0xf0:
                             // characters U-00010000 - U-001FFFFF, mask 11110XXX
                             $utf8 .= substr($chrs, $c, 4);
                             $c += 3;
                             break;
                         case ($ord_chrs_c & 0xfc) == 0xf8:
                             // characters U-00200000 - U-03FFFFFF, mask 111110XX
                             $utf8 .= substr($chrs, $c, 5);
                             $c += 4;
                             break;
                         case ($ord_chrs_c & 0xfe) == 0xfc:
                             // characters U-04000000 - U-7FFFFFFF, mask 1111110X
                             $utf8 .= substr($chrs, $c, 6);
                             $c += 5;
                             break;
                     }
                 }
                 return $utf8;
             } elseif (preg_match('/^\\[.*\\]$/s', $str) || preg_match('/^\\{.*\\}$/s', $str)) {
                 if ($str[0] == '[') {
                     $stk = array(3);
                     $arr = array();
                 } else {
                     $stk = array(4);
                     $obj = array();
                 }
                 array_push($stk, array('what' => 1, 'where' => 0, 'delim' => false));
                 $chrs = substr($str, 1, -1);
                 $chrs = preg_replace(array('#^\\s*//(.+)$#m', '#^\\s*/\\*(.+)\\*/#Us', '#/\\*(.+)\\*/\\s*$#Us'), '', $chrs);
                 $chrs = trim($chrs);
                 if ($chrs == '') {
                     if (reset($stk) == 3) {
                         return $arr;
                     } else {
                         return $obj;
                     }
                 }
                 $strlen_chrs = strlen($chrs);
                 for ($c = 0; $c <= $strlen_chrs; ++$c) {
                     $top = end($stk);
                     $substr_chrs_c_2 = substr($chrs, $c, 2);
                     if ($c == $strlen_chrs || $chrs[$c] == ',' && $top['what'] == 1) {
                         $slice = substr($chrs, $top['where'], $c - $top['where']);
                         array_push($stk, array('what' => 1, 'where' => $c + 1, 'delim' => false));
                         if (reset($stk) == 3) {
                             array_push($arr, Jaws_UTF8::json_decode($slice));
                         } elseif (reset($stk) == 4) {
                             $parts = array();
                             if (preg_match('/^\\s*(["\'].*[^\\\\]["\'])\\s*:\\s*(\\S.*),?$/Uis', $slice, $parts)) {
                                 $key = Jaws_UTF8::json_decode($parts[1]);
                                 $val = Jaws_UTF8::json_decode($parts[2]);
                                 $obj[$key] = $val;
                             } elseif (preg_match('/^\\s*(\\w+)\\s*:\\s*(\\S.*),?$/Uis', $slice, $parts)) {
                                 $key = $parts[1];
                                 $val = Jaws_UTF8::json_decode($parts[2]);
                                 $obj[$key] = $val;
                             }
                         }
                     } elseif (($chrs[$c] == '"' || $chrs[$c] == "'") && $top['what'] != 2) {
                         array_push($stk, array('what' => 2, 'where' => $c, 'delim' => $chrs[$c]));
                     } elseif ($chrs[$c] == $top['delim'] && $top['what'] == 2 && (strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1) {
                         array_pop($stk);
                     } elseif ($chrs[$c] == '[' && in_array($top['what'], array(1, 3, 4))) {
                         array_push($stk, array('what' => 3, 'where' => $c, 'delim' => false));
                     } elseif ($chrs[$c] == ']' && $top['what'] == 3) {
                         array_pop($stk);
                     } elseif ($chrs[$c] == '{' && in_array($top['what'], array(1, 3, 4))) {
                         array_push($stk, array('what' => 4, 'where' => $c, 'delim' => false));
                     } elseif ($chrs[$c] == '}' && $top['what'] == 4) {
                         array_pop($stk);
                     } elseif ($substr_chrs_c_2 == '/*' && in_array($top['what'], array(1, 3, 4))) {
                         array_push($stk, array('what' => 5, 'where' => $c, 'delim' => false));
                         $c++;
                     } elseif ($substr_chrs_c_2 == '*/' && $top['what'] == 5) {
                         array_pop($stk);
                         $c++;
                         for ($i = $top['where']; $i <= $c; ++$i) {
                             $chrs = substr_replace($chrs, ' ', $i, 1);
                         }
                     }
                 }
                 if (reset($stk) == 3) {
                     return $arr;
                 } elseif (reset($stk) == 4) {
                     return $obj;
                 }
             }
     }
 }
Example #2
0
 /**
  * Does the recursion on the data being fetched
  *
  * @access  private
  * @param   mixed   $keys           The key being fetched, it can be an array with multiple keys in it to fetch and
  *                                  then an array will be returned accourdingly.
  * @param   string  $method         Which super global is being fetched from
  * @param   bool    $filter         Returns filtered data or not
  * @param   bool    $xss_strip      Returns stripped html data tags/attributes
  * @param   bool    $json_decode    Decode JSON data or not
  * @return  mixed   Null if there is no data else an string|array with the processed data
  */
 private function _fetch($keys, $method = '', $filters = true, $xss_strip = false, $json_decode = false)
 {
     $method = empty($method) ? strtolower($_SERVER['REQUEST_METHOD']) : $method;
     if (is_array($keys)) {
         $result = array();
         foreach ($keys as $key) {
             $k = strtok($key, ':');
             $result[$k] = $this->_fetch($key, $method, $filters, $xss_strip, $json_decode);
         }
         return $result;
     }
     $key = strtok($keys, ':');
     $type = strtok(':');
     if (isset($this->data[$method][$key])) {
         $value = $json_decode ? Jaws_UTF8::json_decode($this->data[$method][$key]) : $this->data[$method][$key];
         // try unserialize value
         if (false !== ($tvalue = @unserialize($value))) {
             $value = $tvalue;
             unset($tvalue);
         }
         // filter not allowed html tags/attributes
         if ($xss_strip) {
             $value = $this->strip_tags_attributes($value);
         }
         if ($filters === true) {
             $filters = $this->_filtersPriority;
         } elseif (!empty($filters)) {
             $filters = array('strip_null', $filters);
         } else {
             $filters = array('strip_null');
         }
         if (is_array($value)) {
             array_walk_recursive($value, array(&$this, 'filter'), $filters);
         } else {
             $this->filter($value, $key, $filters);
         }
         return $this->func_type_check[$type]($value) ? $value : null;
     }
     return null;
 }