为什么preg_match会返回一些空元素?

时间:2015-12-08 10:43:47

标签: php regex

我已经写了正则表达式^(?:([1-5])|([1-5]) .*|.* ([1-5])|.* ([1-5]) .*)$以匹配独立数字1-5,或者由字符串的其余部分分隔至少一个空格的数字。我在在线服务中对它进行了测试,结果就是数字本身。但是,使用代码时

preg_match('/^(?:([1-5])|([1-5]) .*|.* ([1-5])|.* ([1-5]) .*)$/', 'order 12314124 5', $matches);

我明白了:

Array ( [0] => order 12314124 5 [1] => [2] => [3] => 5 )

[0]元素是完全匹配,这很好。我预计[1]元素为5,但它是空的,还有另一个空元素。为什么会出现这些空元素?

1 个答案:

答案 0 :(得分:3)

如果您在regex101.com上使用了正则表达式,则会隐藏所有非参与组(即不匹配的组)。您可以在选项中打开它们:

enter image description here

你会看到它们:

enter image description here

快速解决方法是使用分支重置(?|...)而不是非捕获组(?:...)并访问$matches[1]值:

preg_match('/^(?|([1-5])|([1-5]) .*|.* ([1-5])|.* ([1-5]) .*)$/', 'order 12314124 5', $matches);
print_r($matches[1]); // => 5

请参阅IDEONE demo