【发布时间】:2013-08-25 14:43:40
【问题描述】:
给出以下文字
bond0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
eth0: 11329920252 12554462 0 0 0 0 0 3561 13072970332 12899522 0 0 0 0 0 0
我需要捕获列值。我想到了这些行:
Regex: `(\w+):(?:\s+(\d+))+`
Php: `preg_match_all('/(\w+):(?:\s+(\d+))+/sim', $data, $regs)
但不幸的是,它只捕获第一列。
Array
(
[0] => Array
(
[0] => dummy0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[1] => bond0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[2] => eth0: 11329920252 12554462 0 0 0 0 0 3561 13072970332 12899522 0 0 0 0 0 0
[3] => ip6tnl0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[4] => lo: 51675995 100695 0 0 0 0 0 0 51675995 100695 0 0 0 0 0 0
[5] => sit0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[6] => tunl0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
)
[1] => Array
(
[0] => 0
[1] => 0
[2] => 0
[3] => 0
[4] => 0
[5] => 0
[6] => 0
)
)
有什么建议吗?谢谢 `
====编辑====
明确一点:我知道我可以 preg_match 搜索 \d+ 值或将整个字符串分成几行并在每一行上运行explode,但我对正则表达式解决方案感兴趣,我将第一列作为第一个成员结果数组(实际上忘记在问题的初稿中放置捕获括号),以及带有数据的后续列,每一行都放在它的专用数组中......
【问题讨论】:
-
在这里使用
explode()也是一个可行的解决方案。 -
$array = explode($var,"\t");会为你做的 -
我不想使用explode,因为我在问题更新中写过的原因。无论如何谢谢。
-
如果您没有找到
preg_match解决方案,我会在评论中添加我的解决方案:<?php $val = "bond0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 eth0: 11329920252 12554462 0 0 0 0 0 3561 13072970332 12899522 0 0 0 0 0 0"; $arr1 = explode("\n",$val); foreach ($arr1 as $key => $value) { $exp = explode(":",$value); $ex = preg_replace('/\s+/', ' ',trim($exp[1])); $arr[$exp[0]] = explode(" ",$ex); } var_dump($arr); ?> -
每行的列数是固定的吗?如果没有,您要求的是可变数量的捕获,并且只有 .NET 可以做到。