在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(删除前导空格后)。
答案 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);