据我所知,这不仅是PHP的问题,而且我在这里问的是PHP(实际上是PHP7)。
考虑这样简单的正则表达式(如果不清楚 - 它是示例):
/((\w+): (\d+))+/
及其文字:
foo: 2008bar: 2009
匹配在整个文本上,问题是一旦正则表达式引擎在文本上前进,就会使用和忘记子捕获。因此,您将只获得最后一次捕获。
我想获得所有有效(正确)的捕获,所以整个历史记录,不仅仅是最后的捕获。
以下是测试它的代码:
<?php
$str = 'foo: 2008bar: 2009';
preg_match_all('/((\w+): (\d+))+/', $str, $matches);
print_r($matches);
?>
这是输出
Array
(
[0] => Array
(
[0] => foo: 2008bar: 2009
)
[1] => Array
(
[0] => bar: 2009
)
[2] => Array
(
[0] => bar
)
[3] => Array
(
[0] => 2009
)
)
正如您所看到的那样,整个文本都匹配,但对于捕获,只存储了最后一个文本。那些都不见了:
foo: 2008
foo
2008
因此我的问题是:如何获得捕获的整个“历史”?
答案 0 :(得分:0)
对于此任务,\G
(继续转义序列)穿着与身长相同的斗篷并具有 X 射线视觉。 ;)
它允许您从字符串的开头或模式最后完成的位置进行匹配。
代码:(Demo)
$str = 'foo: 2008bar: 2009';
var_export(
preg_match_all(
'~\G(\w+): (\d+)~',
$str,
$out
)
? $out
: 'no matches'
);
输出:
array (
0 =>
array (
0 => 'foo: 2008',
1 => 'bar: 2009',
),
1 =>
array (
0 => 'foo',
1 => 'bar',
),
2 =>
array (
0 => '2008',
1 => '2009',
),
)