Php正则表达式:如何匹配重复模式
给出以下文本Php正则表达式:如何匹配重复模式,php,regex,Php,Regex,给出以下文本 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
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,但我对regex解决方案感兴趣,在这个解决方案中,我将第一列作为结果数组的第一个成员(实际上忘记了在问题的第一稿中使用捕获括号),下面是数据列,每一行都放在它的专用数组中…给你:
$data = explode("\n", $data);
$out = array();
foreach ($data as $d) {
preg_match_all('/\s(\d+)/', $d, $matches);
将$matches[0]
放置为一个匹配数组。然后要将其添加到行数组中:
$out[] = $matches[0];
}
现在您有了一个锯齿状的行和列数组。因此,参考第二行第四列,您可以转到
$out[1][3]
您可以这样做:
$subject = <<<LOD
dummy0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
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
ip6tnl0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
lo: 51675995 100695 0 0 0 0 0 0 51675995 100695 0 0 0 0 0 0
sit0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
tunl0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LOD;
$pattern = '~^(?<item>\w++)\s*:|\G\s*(?<value>\d++)~m';
preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);
$i=-1;
foreach($matches as $match) {
if (isset($match['value']))
$result[$i]['values'][] = $match['value'];
else {
$i++;
$result[$i]['item'] = $match['item']; }
}
print_r($result);
$subject=我知道您正在寻找preg\u 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 $value) {
$exp = explode(":",$value);
$ex = preg_replace('/\s+/', ' ',trim($exp[1]));
$arr[$exp[0]] = explode(" ",$ex);
}
var_dump($arr);
?>
为什么要使用preg\u match
或preg\u match\u all
$results = array();
foreach (preg_split("/\r\n|\r|\n/", $data) as $line)
{
list($key, $values) = explode(":", $line);
$results[$key] = preg_split("/\s/", trim($values));
}
只要每一行上不超过一个:
,这就可以工作。在我看来,这也是写这篇文章最短、最快的方法。在这里使用explode()
也是一个可行的解决方案。$array=explode($var,“\t”)
会为你做的我不想使用explode,因为我在更新中写了一些问题。反正是Thx。如果您没有找到preg\u match
解决方案,我会在注释中添加我的解决方案:
每行的列数是固定的吗?如果不是,您要求的捕获数量是可变的,并且只有.NET可以这样做。为什么要用括号括起来?啊,不需要。删除。array\u map('trim',$matches[0])
更好:)它更小,但性能受到影响。Foreach速度更快,更灵活。/\s(\d+)/
,无需修剪即可获得相同的结果,这是一种非常笨重的方法。@ConnorPeet:没有你想象的那么笨重,因为该模式只应用一次。这不是我想要的(而且似乎不可能执行其他操作),但我认为这个答案是最优雅的。
array (size=2)
'bond0' =>
array (size=17)
0 => string '' (length=0)
1 => string '0' (length=1)
2 => string '0' (length=1)
3 => string '0' (length=1)
4 => string '0' (length=1)
5 => string '0' (length=1)
6 => string '0' (length=1)
7 => string '0' (length=1)
8 => string '0' (length=1)
9 => string '0' (length=1)
10 => string '0' (length=1)
11 => string '0' (length=1)
12 => string '0' (length=1)
13 => string '0' (length=1)
14 => string '0' (length=1)
15 => string '0' (length=1)
16 => string '0' (length=1)
'eth0' =>
array (size=17)
0 => string '' (length=0)
1 => string '11329920252' (length=11)
2 => string '12554462' (length=8)
3 => string '0' (length=1)
4 => string '0' (length=1)
5 => string '0' (length=1)
6 => string '0' (length=1)
7 => string '0' (length=1)
8 => string '3561' (length=4)
9 => string '13072970332' (length=11)
10 => string '12899522' (length=8)
11 => string '0' (length=1)
12 => string '0' (length=1)
13 => string '0' (length=1)
14 => string '0' (length=1)
15 => string '0' (length=1)
16 => string '0' (length=1)
$results = array();
foreach (preg_split("/\r\n|\r|\n/", $data) as $line)
{
list($key, $values) = explode(":", $line);
$results[$key] = preg_split("/\s/", trim($values));
}