0

次の PHP コードがあるとします。

<?php
$str = '/foo/bar/baz';
preg_match('#^(/[^/]+?)*$#', $str, $matches);
var_dump($matches);

...次の出力が得られます。

array (size=2)
  0 => string '/foo/bar/baz' (length=12)
  1 => string '/baz' (length=4)

…が、理由がわかりません。(/[^/]+?)の各一致が独自のグループにキャプチャされ、 にスタックされることを期待し$matchesます。代わりに、次のようになります。

array (size=4)
  0 => string '/foo/bar/baz' (length=12)
  1 => string '/foo' (length=4)
  2 => string '/bar' (length=4)
  3 => string '/baz' (length=4)

私は何が欠けていますか?

編集:

これは、代わりに使用した場合の出力ですが、preg_match_all()まだ探しているものではありません:

array (size=2)
  0 => 
    array (size=1)
      0 => string '/foo/bar/baz' (length=12)
  1 => 
    array (size=1)
      0 => string '/baz' (length=4)
4

4 に答える 4

1

これは、繰り返しキャプチャ グループの標準的な動作です。すべての繰り返しに一致しますが、最後の繰り返しのみをキャプチャします。正規表現グループと * ワイルドカードは連携できますか?を参照してください。Pythonを使用した同様の質問について。Perl で試してみましたが、同じ結果が得られました。

于 2012-08-11T04:54:45.333 に答える
0

preg_match は最初のもののみを取得します。それらすべてが必要な場合は、preg_match_all を使用します。

ただし、これが実際に正確なユースケースである場合は、代わりにexplode()を使用してください。

于 2012-08-11T04:23:34.807 に答える
0

動的キャプチャ グループでやろうとしていることは、いくつかの正規表現フレーバー (C# -可変数のグループを持つ正規表現など) で可能ですが、残念ながら PHP では不可能です。

于 2012-08-11T04:49:00.027 に答える
0

多分このように:

preg_match_all('(/[^/]+)', $str, $matches);
于 2012-08-11T04:41:45.137 に答える