我有以下正则表达式函数:
function getMatches($string_content) {
$matches = array();
preg_match_all('/@([A-Za-z0-9_]+)/', $string_content, $matches);
return $matches;
}
现在,它返回一个这样的数组:
Array (
[0] => Array (
[0] => @test
[1] => @test2
)
[1] => Array (
[0] => test
[1] => test2
)
)
如何才能使仅返回没有@符号的匹配?
答案 0 :(得分:2)
返回$matches[1]
而不是$matches
。
这将为您提供第一个捕获组而不是所有匹配。
答案 1 :(得分:1)
只需在正则表达式中使用\K
即可避免在最终结果中使用@
而且您不需要捕获任何内容,
preg_match_all('~@\K[A-Za-z0-9_]+~', $string_content, $matches);
OR
使用lookbehind,
preg_match_all('~(?<=@)[A-Za-z0-9_]+~', $string_content, $matches);
样本
<强>解释强>
(?<=@)
正则表达式引擎将匹配标记设置在@
符号后面。[A-Za-z0-9_]+
匹配一个或多个单词字符。答案 2 :(得分:1)
通过这个小调整(你可以检查the regex demo中的匹配):
preg_match_all('~@\K\w+~', $string_content, $matches);
<强>解释强>
([A-Za-z0-9_]+)
周围的括号会创建一个捕获组。这就是数组包含索引#1的第二个元素的原因:此元素包含第1组捕获。\w
相当于[A-Za-z0-9_]
\K
告诉引擎放弃与其返回的最终匹配相匹配的内容。它比使用lookbehind (?<=@)
~
只是一个小小的美学调整 - 你可以在你的正则表达式模式周围使用你喜欢的任何分隔符。答案 3 :(得分:1)
您不需要对正则表达式进行任何更改,只需参考捕获组#1
,即$matches[1]
来打印捕获组的匹配结果,不包括{{1}你的数组匹配。
您的代码如下所示:
@
输出
function getMatches($string_content) {
preg_match_all('/@([A-Za-z0-9_]+)/', $string_content, $matches);
return $matches[1];
}
print_r(getMatches('foo bar @test baz @test2 quz'));