排除在数组中返回的字符

时间:2014-07-20 04:53:17

标签: php regex

我有以下正则表达式函数:

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
    )
) 

如何才能使仅返回没有@符号的匹配

4 个答案:

答案 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'));