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

one*_*ror 6 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);
Run Code Online (Sandbox Code Playgroud)

我明白了:

Array ( [0] => order 12314124 5 [1] => [2] => [3] => 5 )
Run Code Online (Sandbox Code Playgroud)

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

Wik*_*żew 3

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

在此输入图像描述

你会看到他们:

在此输入图像描述

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

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

查看IDEONE 演示