如何获取捕获的历史记录


How to get the history of the captures

据我所知,这不仅是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

因此,我的问题是:如何获取捕获的整个"历史"?

对于这项任务,'G(继续逃生序列)穿着齐身斗篷,具有x射线视力。;)

它允许您从字符串的开始或从模式最后完成的位置进行匹配。

代码:(演示)

$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',
  ),
)