请考虑以下代码:
preg_match('/(\d)(\d?)/', '1', $matches);
var_export($matches);
输出:
array (
0 => '1',
1 => '1',
2 => '',
)
所以可选的[2]
条目是 set ,但是是一个空字符串。
但是,我记得在过去看到过一个可选的捕获组在最后使用时未设置(数组将停在[1]
)的情况。
我是梦想,还是某些情况下未设置?
我知道如果我想确定我可以使用if (! isset($matches[2]) || $matches[2] == '')
,但这会不必要地混乱代码。
答案 0 :(得分:5)
这取决于您是否选择整个捕获组。
如果你需要组,但允许它匹配空字符串,那么匹配将始终设置,但可能是空的:
preg_match('/(\d)(\d?)/', '1', $matches); // $matches[2] === ''
如果通过将量词?
移到括号外来使组成为可选组,则匹配将有条件地设置:
preg_match('/(\d)(\d)?/', '1', $matches); // no $matches[2]