为什么preg_match匹配多个空字符串

Why does preg_match match multiple empty strings

为什么会出现以下正则表达式:

$regex = '^([abc]+)$|^([012]+)$|^([23]+)$|^([123]+)$';
$toMatch = '123';
preg_match('/'.$regex.'/', $toMatch, $matches);

得出这个结果:

array(5) {
  [0]=>
  string(3) "123"
  [1]=>
  string(0) ""
  [2]=>
  string(0) ""
  [3]=>
  string(0) ""
  [4]=>
  string(3) "123"
}

为什么元素 1,2 和 3 是空字符串,而它们不匹配任何内容?怎么会有 "empty" 个匹配项?

提前致谢

您试图使用 () 语法捕获 4 个不同的东西。因此,$matches 数组中将有 4 个不同的元素。只有最后一次捕获才会匹配字符串 123 (^[123]+$).

documentation

您收到 3 个空元素,因为您的前三个捕获组 ([abc]+)([012]+)([23]+) 没有匹配任何内容。

如果您只想要一个捕获组,您可以像这样更新您的正则表达式:

preg_match('/^([abc]+|[012]+|[23]+|[123]+)$/', '123', $match);

哪个会给你:

array(2) {
  [0]=>
  string(3) "123"
  [1]=>
  string(3) "123"
}