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

也许是这样的:

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

您尝试对动态捕获组进行的操作在某些正则表达式风格中是可能的(例如 C# -具有可变数量组的正则表达式?),但不幸的是在 PHP 中不行。

于 2012-08-11T04:49:00.027 回答