Php 正则表达式中的动态捕获组

Php 正则表达式中的动态捕获组,php,regex,Php,Regex,给定以下PHP代码: <?php $str = '/foo/bar/baz'; preg_match('#^(/[^/]+?)*$#', $str, $matches); var_dump($matches); …但我不明白为什么。我希望(/[^/]+?)的每一个匹配项都被捕获到自己的组中,并固定在$matches中,因此它看起来像这样: array (size=4) 0 => string '/foo/bar/baz' (length=12) 1 => string

给定以下PHP代码:

<?php
$str = '/foo/bar/baz';
preg_match('#^(/[^/]+?)*$#', $str, $matches);
var_dump($matches);
…但我不明白为什么。我希望
(/[^/]+?)
的每一个匹配项都被捕获到自己的组中,并固定在
$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\u match\u all()
时的输出,这仍然不是我想要的:

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

preg_比赛只抢第一名。如果您想要所有这些,请使用preg_match_all

但是:如果这确实是一个确切的用例,请改用explode()

可能是这样的:

preg_match_all('(/[^/]+)', $str, $matches);

在某些正则表达式风格(如C#-)中,您可以尝试使用动态捕获组,但不幸的是,在PHP中不能使用动态捕获组。

这是重复捕获组的标准行为——它们匹配所有重复,但只捕获最后一个。有关使用Python的类似问题,请参见。我在Perl中尝试了它,得到了相同的结果。

这不是
preg\u match\u all()
所做的。它会给我基本上相同的输出,按匹配项分开,但只有一个匹配项。我用
preg\u match\u all()
的输出编辑了这个问题。我需要匹配整个字符串,而我不能使用
preg\u match\u all()
。例如,
$str=“test/foo/bar/baz”
是无效的,但如果我使用它,它仍然会匹配。
preg_match_all('(/[^/]+)', $str, $matches);