2

让我们简化问题:

我所需要的只是用括号之间的逗号来爆炸()字符串。问题是逗号选择的元素本身可以有一个逗号,因此简单的爆炸不起作用。我不是在问如何解码 JSON。

参数的数量,它们的类型总是不同的,例如

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

假设我有这部分代码:

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

谁能建议一个正则表达式(或替代方法)来获取所有逗号分隔的条目(作为字符串)?问题是变量本身可以包含逗号。因此,我认为这需要递归。

预期结果将是一个包含以下条目的数组:

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

5 回答 5

2

经过数小时的工作,我发现 PHP 将无法解析包含 NULL(大写 null)的 JSON 字符串。这就是导致以下代码不起作用的原因。但是,只需将 NULL 替换为 null 即可解决问题。

var_dump(json_decode('[{"class": "navigation", "id": "navigation"}, NULL, "bar"]')
于 2011-02-27T16:15:10.683 回答
2

这是可行的:

$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'"
}

不完全是递归正则表达式,而是向前看的断言。条件是逗号后面不能跟},或者后面应该跟{。

于 2011-02-27T16:45:44.053 回答
0

在 [ 和 ] 之间添加该代码,并使用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'
于 2011-02-27T15:39:25.133 回答
0

这看起来像json。您应该使用 json_decode,它将创建一个数组,然后您可以遍历数组以获取键/值。

于 2011-02-27T15:39:49.350 回答
0

黑客警报!

  1. 将 {} 换成单引号,这样你的 {"JSON": "data"} 就变成了 '{"JSON": "data"}'

  2. 使用 str_getcsv() 解析字符串(现在是 CSV)

  3. 遍历结果数组并从 {} 中去除单引号

于 2011-02-27T15:55:43.007 回答