正则表达式匹配@Joe的标签,但不匹配电子邮件地址

时间:2012-03-22 16:33:34

标签: php regex

在PHP中,我想在字符串中获取所有标签(例如@Joe),但要避免使用电子邮件地址(例如dave@example.com)。

所以:

@Joe hello! @Dave's email address is dave@example.com

我想只匹配@Joe和@Dave。

我正在尝试的正则表达式是

preg_match_all("([ ^]@[a-zA-Z0-9]+)", $comment, $atMatches); 

但是这只匹配@Dave(删除前导空格后)。

4 个答案:

答案 0 :(得分:6)

您可以使用\B(不是单词边界)escape sequence来排除在其之前具有单词(如示例文本中的“dave”)的匹配项。类似的东西:

preg_match_all("/\B(@[a-zA-Z0-9]+)/", $comment, $atMatches); 

顺便说一下,你的语法中没有使用正确的分隔符。

答案 1 :(得分:1)

以下正则表达式应与@Joe@Dave匹配,同时忽略's和电子邮件地址:

(^@[a-zA-Z0-9]{1,})|(\s@[a-zA-Z0-9]{1,})

// ^@[a-zA-Z0-9]{1,}      matches @Name at the beginning of the line
// \s@[a-zA-Z0-9]{1,}     matches @Names that are preceded by a space (i.e. not an email address)

答案 2 :(得分:0)

这听起来与Twitter正则表达式非常相似......

您可以尝试从here编辑以下示例。

function linkify_tweet($tweet) {
    $tweet = preg_replace('/(^|\s)@(\w+)/',
        '\1@<a href="http://www.twitter.com/\2">\2</a>',
        $tweet);
    return preg_replace('/(^|\s)#(\w+)/',
        '\1#<a href="http://search.twitter.com/search?q=%23\2">\2</a>',
        $tweet);
}

答案 3 :(得分:0)

这个将与您的示例匹配,忽略电子邮件和“'”

preg_match_all("/(^|\s)(@.*?)['\s]/", $string, $matches);