PCRE累积匹配组的多次出现

时间:2016-12-21 18:52:48

标签: php regex pcre

我想知道这是否可行。我有这样的模式:

foo:(?<id>\d+)(?::(?<srcid>\d+))*

现在我匹配这个标本:

asdasdasd {{foo:1381:2:4:7}}

我得到了比赛:

Full match      `foo:1381:2:4:7`
Group `id`      `1381`
Group `srcid`   `7`

但是,是否可以获得如下结果:

Full match      `foo:1381:2:4:7`
Group `id`      `1381`
Group `srcid`   [`2`, `4`, `7`]

我需要这个来处理多个匹配,例如asdasdasd {{foo:1381:2:4:7}} {{foo:1111}}

1 个答案:

答案 0 :(得分:1)

您可以在PCRE正则表达式中使用\G在上一场比赛结束后获得多场比赛:

(?:{{foo:(?<id>\d+)|(?<!^)\G)(?::(?<srcid>\d+)|}})

RegEx Demo

\G在上一场比赛结束或第一场比赛的字符串开头处断言位置。

示例代码:

$str = 'asdasdasd {{foo:1381:2:4:7}}';
preg_match_all('/(?:foo:(?<id>\d+)|(?<!^)\G):(?<srcid>\d+)/', $str, $m);

print_r($m['srcid']);
echo $m['id'][0]; // 1381

<强>输出:

Array
(
    [0] => 2
    [1] => 4
    [2] => 7
)
1381