preg_match_all返回太多结果

时间:2016-04-28 08:48:06

标签: php regex

<?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',
  ),
)

2 个答案:

答案 0 :(得分:3)

这就是preg_match_all()和捕获小组的工作方式。

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

例如:

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

请注意,默认情况下:

  

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

所以你真的不需要在你的情况下捕捉任何东西:

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

答案 1 :(得分:2)

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

/@\w+\s\w+/

在此测试:

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

结果:

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