2

考虑以下代码:

preg_match('/(\d)(\d?)/', '1', $matches);
var_export($matches);

它输出:

array (
  0 => '1',
  1 => '1',
  2 => '',
)

所以可选[2]条目是set,但是是一个空字符串。

但是,我记得过去曾见过最后使用时未设置可选捕获组的情况(数组将停止在[1])。

是我做梦了,还是有一些无法设置条目的情况?

我知道if (! isset($matches[2]) || $matches[2] == '')如果我想确定我可以使用,但这会使代码不必要地混乱。

4

1 回答 1

5

这取决于您是否将整个捕获组设为可选。

如果您使组成为必需但允许它匹配空字符串,则匹配将始终设置,但可能为空:

preg_match('/(\d)(\d?)/', '1', $matches); // $matches[2] === ''

如果通过将量词移到?括号外使组成为可选,则匹配将有条件地设置:

preg_match('/(\d)(\d)?/', '1', $matches); // no $matches[2]
于 2013-07-19T10:39:44.447 回答