2016-12-21 8 views
1

これが可能かどうか疑問です。私は、パターンています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}}

+0

ありません。すべての 'srcid'数字をマッチさせて後で分割するか、' \ G'を使って複数の時刻にマッチさせることができます。ここで 'id'は最初のマッチにのみ含まれます。 –

答えて

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 
+0

ありがとうございました!私はグループ全体の複数のマッチで動作するようにこれを必要としているはずです。試してみると正しく動作しないようです。 '{{foo:1381:2:4:7}} {{foo:1111}}'となります。次に、2番目のIDは空です。それも可能ですか? – ypnos

+0

ok更新された正規表現と新しいデモのリンクを確認してください – anubhava

+1

驚くべきこと、魅力のように動作します! – ypnos

関連する問題