preg_match_all返回的结果太多


preg_match_all returning too many results

<?php 
$string = "String is '@Name Surname test @Secondname Surname tomas poas tomas'"
preg_match_all("/@('w+)('s)('w+)/", $string, $matches);

我想要提取:

[
0 => '@Name Surname',
1 => '@Secondname Surname',
]

我得到什么;

array (
  0 => 
  array (
    0 => '@Name Surname',
    1 => '@Secondname Surname',
  ),
  1 => 
  array (
    0 => 'Name',
    1 => 'Secondname',
  ),
  2 => 
  array (
    0 => ' ',
    1 => ' ',
  ),
  3 => 
  array (
    0 => 'Surname',
    1 => 'Surname',
  ),
)
这就是

preg_match_all()和捕获组的工作方式。

如果您只需要整个名称,则需要将其减少到您只需要的内容或使用非捕获括号。

例如:

preg_match_all("/(@'w+'s'w+)/", $string, $matches);

请注意,默认情况下:

对结果进行排序,使 $matches[0] 是完整模式的数组 匹配,$matches 1 是与第一个匹配的字符串数组 括号中的子模式,依此类推。

因此,您真的不需要捕获任何内容:

preg_match_all("/@'w+'s'w+/", $string, $matches);

使用此表达式(将捕获组删除到空格(

/@'w+'s'w+/

在这里测试它:

https://regex101.com/r/cL5xH2/2

结果:

[
0 => '@Name Surname',
1 => '@Secondname Surname',
]