preg_match()设置空字符串或不设置的规则是什么?

时间:2013-07-19 10:37:28

标签: php

请考虑以下代码:

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

输出:

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

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

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

我是梦想,还是某些情况下未设置

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

1 个答案:

答案 0 :(得分:5)

这取决于您是否选择整个捕获组。

如果你需要组,但允许它匹配空字符串,那么匹配将始终设置,但可能是空的:

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

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

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