php递归字符串解析

时间:2018-09-02 10:44:06

标签: php regex string parsing recursion

fetch("https://facebook.github.io/react-native/movies.json")
.then(response => response.json())
.then((responseJson) => {
    console.log('HI THERE')
    // console.error(responseJson);
})
.catch(error => {
  console.log(error);
});

我如何在php中将此字符串解析为array(带有键,值)。

{‘a’: True, ‘b’: ‘c’, 'd':{'e': 'f', 'g': h}}

这不是标准的json。我不能使用json_decode。


我尝试了json_decode。

样本数据:

  

Array( a -> True b -> 'c' d -> Array( e -> f g -> h ) )

1 个答案:

答案 0 :(得分:0)

您可以以此为起点:

 $data="{'timestamp': '0.', 'class': 'vbd_metrics', 'snapshot': {'io_read_kbs': 0.0, 'last_updated': <DateTime u'19700101T00:00:00Z' at 8b7cacc>, 'uuid': '7b3e71e5-b43a-2c5d-d582-09302901c7fe', 'other_config': {}, 'io_write_kbs': 0.0}, 'operation': 'mod', 'ref': 'OpaqueRef:1c934395-abe1-36a8-9926-20c5e03c1799', 'id': '895794'}";

  Var_dump(eval('return '.join('',array_slice(array_map(
  function($v){
      if(is_array($v)){
        $v[1]=str_replace('’','"',$v[1]);
        $v[1]=str_replace('‘','"',$v[1]);
        $v[1]=trim($v[1]);
        if(!empty($v[1])&&$v[1][0]==='<'&&$v[1][strlen($v[1])-1]==='>')
            $v[1]=substr($v[1],1,-1);
        $v=$v[1];
    }else{
        if($v==='{') $v='[';
        if($v==='}') $v=']';
        if($v===':') $v='=>';
        if($v==='<') $v='"';
        if($v==='>') $v='"';
    }

    return $v;

},token_get_all('<?php '.$data.' ?>')),1,-1)).';'));

输出为:

array(6) {
  ["timestamp"]=>
  string(2) "0."
  ["class"]=>
  string(11) "vbd_metrics"
  ["snapshot"]=>
  array(5) {
    ["io_read_kbs"]=>
    float(0)
    ["last_updated"]=>
    string(38) "DateTimeu'19700101T00:00:00Z'at8b7cacc"
    ["uuid"]=>
    string(36) "7b3e71e5-b43a-2c5d-d582-09302901c7fe"
    ["other_config"]=>
    array(0) {
    }
    ["io_write_kbs"]=>
    float(0)
  }
  ["operation"]=>
  string(3) "mod"
  ["ref"]=>
  string(46) "OpaqueRef:1c934395-abe1-36a8-9926-20c5e03c1799"
  ["id"]=>
  string(6) "895794"
}

此代码基本上模拟了有效的PHP代码的解析,然后允许使用str_replace轻松替换某些字符。最后我们删除Start标记和end标记。我们加入数组以获取字符串,然后使用eval返回它作为有效数组。肮脏但有效。