将字符串解析为数组{{navigation({“class”:“navigation”,“id”:“navigation”})}}第2部分

时间:2011-02-27 15:05:25

标签: php regex php-5.3 recursive-regex

让我们简化一下问题:

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

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

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

假设我有这部分代码:

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

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

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

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

5 个答案:

答案 0 :(得分:2)

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

var_dump(json_decode('[{"class": "navigation", "id": "navigation"}, NULL, "bar"]')

答案 1 :(得分: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'"
}

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

答案 2 :(得分: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'

答案 3 :(得分:0)

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

答案 4 :(得分:0)

黑客警报!

  1. 将{}包装成单引号,以便您的{“JSON”:“data”}变为“{”JSON“:”data“}'

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

  3. 从{}

  4. 获取结果数组并删除单引号