2016-04-28 105 views
1
<?php 

$string = "String is '@Name Surname test @Secondname Surname tomas poas tomas'" 

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

我想摘錄:preg_match_all返回的結果太多

[ 
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', 
), 
) 
+0

這就是'preg_match_all()'的工作原理。 1 subArray =整個匹配,2subArray 1捕獲組,3subArray 2捕獲組,... – Rizier123

回答

3

這就是preg_match_all()和捕獲組的工作方式。

如果你只是想要所有的名字,你需要減少到只需要或使用非捕獲括號。

例如:

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

。注意,通過默認值:

結果排序使得$ matches [0]被滿圖案的陣列 匹配,則$匹配1是陣列由第一個 加括號的子模式匹配的字符串,依此類推。

所以,你真的不需要你的情況來捕捉任何東西:

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

使用此表達式(除去捕獲組空格)

/@\w+\s\w+/ 

測試在這裏:

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

結果:

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