парсинг строки в массив {{navigation ({"class": "navigation", "id": "navigation"})}} часть 2 - PullRequest
2 голосов
/ 27 февраля 2011

Позвольте упростить вопрос:

Все, что мне нужно, это взорвать строку () запятой в скобках. Проблема в том, что элементы, выбранные через запятую, могут иметь запятую в себе, поэтому простое разнесение не будет работать. Я не спрашиваю, как декодировать JSON.

Количество аргументов, их тип всегда будет разным, например,

('foo')
('bar', NULL)
({"JSON": "data"}, 'test')

Предполагая, что у меня есть эта часть кода:

({"class": "navigation", "id": "navigation"}, NULL, 'bar' /* [..] */)

Может ли кто-нибудь предложить регулярное выражение (или альтернативный метод), чтобы получить все разделенные запятыми записи (в виде строки)? Проблема в том, что переменные могут содержать запятые в себе. Таким образом, я предполагаю, что это требует рекурсии.

Ожидаемым результатом будет массив, содержащий следующие записи:

{"class": "navigation", "id": "navigation"}
NULL
'bar'

Ответы [ 5 ]

2 голосов
/ 27 февраля 2011

Вот что работает:

$str = 'NULL, {"class": "navigation", "id": "navigation"}, NULL, \'bar\'';
var_dump(preg_split( '%(,(?!.*})|,(?=.*{)\s+)%', $str));

Результат:

~$ php ./test.php
array(4) {
  [0]=>
  string(4) "NULL"
  [1]=>
  string(44) "{"class": "navigation", "id": "navigation"}"
  [2]=>
  string(5) "NULL"
  [3]=>
  string(6) "'bar'"
}

Не совсем рекурсивное регулярное выражение, а скорее утверждение на будущееУсловие состоит в том, что запятая не должна сопровождаться}, или должна следовать {.

2 голосов
/ 27 февраля 2011

После многих часов работы я обнаружил, что PHP не сможет проанализировать строку JSON, содержащую NULL (верхний регистр null). Именно это привело к тому, что следующий код не работал. Однако простая замена NULL на null решила проблему.

var_dump(json_decode('[{"class": "navigation", "id": "navigation"}, NULL, "bar"]')
0 голосов
/ 27 февраля 2011

Это похоже на JSON.Вы должны использовать json_decode, который создаст массив, а затем вы можете перебрать массив, чтобы получить ключ / значения.

0 голосов
/ 27 февраля 2011

предупреждение о взломе!

  1. оберните {} в одинарные кавычки, чтобы ваш {"JSON": "data"} стал '{"JSON": "data"}'

  2. использовать str_getcsv () для анализа строки (теперь это CSV)

  3. перейти через полученный массив и убрать одинарные кавычки из {}

0 голосов
/ 27 февраля 2011

Добавьте этот код между [и] и используйте json_decode ()

Должен возвращать ассоциативный массив

Вы должны использовать [] для неявных индексов и {} для явных индексов

Пример:

[] : ['w', null, 123, {'a':1}] <- implicit keys (0, 1, 2, 3)
{} : {'0':'w', '1':null, '2':123, '3':{'a':1}} <- explicit keys (0, 1, 2, 3)

Вы не можете смешивать неявные / явные индексы в одной структуре, но вы можете, например, создать массив ([]), содержащий разные значения, как показано в примерах выше.

$code = substr('({"id":"navigation"}, null, "bar")', 1, -1); // removes ^\( and \)$
$result = json_decode('[' . $code . ']');

echo $result[0]['id']; // returns 'navigation'
echo $result[1]; // returns NULL
echo $result[2]; // returns 'bar'
...