我想知道这是否可行。我有这样的模式:
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}}
。
答案 0 :(得分:1)
您可以在PCRE正则表达式中使用\G
在上一场比赛结束后获得多场比赛:
(?:{{foo:(?<id>\d+)|(?<!^)\G)(?::(?<srcid>\d+)|}})
\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