PHP рекурсивный разбор строк - PullRequest
0 голосов
/ 02 сентября 2018
{‘a’: True, ‘b’: ‘c’, 'd':{'e': 'f', 'g': h}}

как я могу разобрать эту строку в массив (с ключом, значением) в php.

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

Это не стандартный JSON. Я не могу использовать json_decode.


Я попробовал json_decode.

Пример данных:

{'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'}

1 Ответ

0 голосов
/ 02 сентября 2018

Вы можете использовать это как отправную точку:

 $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. Наконец, мы удаляем начальный тег и конечный тег. Мы соединяем массив, чтобы получить строку, а затем используем eval для вернуть его как действительный массив. Грязный, но функциональный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...