将不带分隔符的字符串解析为二维数组

问题描述 投票:0回答:1

我有一个这样的字符串:

 0d(Hi)i(Hello)4d(who)i(where)540d(begin)i(began)

我想用它制作一个数组。 我首先尝试添加分隔符,以便使用php函数explode。

 ;0,d(Hi),i(Hello);4,d(who),i(where);540,d(begin),i(began)

它可以工作,但问题是我想最小化分隔符以节省磁盘空间。 因此我想知道通过使用正则表达式

preg_split()
,是否可以在不使用分隔符的情况下拥有这样的巨大数组:

Array (
    [0] => Array (
        [0] => 0
        [1] => d(hi)
        [2] => i(Hello)
    ) 
    [1] => Array (
        [0] => 4
        [1] => d(who)
        [2] => i(where)
    )
    [2] => Array (
        [0] => 540
        [1] => d(begin)
        [2] => i(began)
    )
)

我尝试了一些代码和正则表达式,但我发现正则表达式中的值没有出现在最终结果中(就像爆炸函数一样,在最终数组中我们没有分隔符。)

此外,我在构建正则表达式时遇到一些困难。这是我做的:

 $modif = preg_split("/[0-9]+(d(.+))?(i(.+))?/", $data); 

我必须明确指出 d() 和 i() 不能存在(但至少有一个)。

php regex text-parsing
1个回答
2
投票

如果你这样做

preg_match_all('/(\d+)(d\([^()]*\))?(i\([^()]*\))?/', $subject, $result, PREG_SET_ORDER);

在你的原始字符串上,然后你会得到一个数组,其中

$result[$i][0]

包含第

i
个匹配项(即
$result[0][0]
将是
0d(Hi)i(Hello)
)以及其中

$result[$i][$c]

包含第

c
匹配的第
i
捕获组(即
$result[0][1]
0
$result[0][2]
d(Hi)
$result[0][2]
i(Hello)
)。

这就是你想要的吗?

© www.soinside.com 2019 - 2024. All rights reserved.