正则表达式检测提及但不检测电子邮件

时间:2014-04-22 13:59:40

标签: php regex

我有以下代码:

preg_match('/@([^@ ]+)/', $image->caption->text, $matches)

我想基本上检测字符串中的提及。但是现在的问题是它与电子邮件地址混淆,因此它会将电子邮件检测为提及,例如,如果我有aksdjasd@yahoo.com,那么这将被视为匹配。我想我想说的是在@符号之前应该有一个空格。但是我如何把它放到这个正则表达式中呢?

修改 我也想在字符串的开头检测@mentions

3 个答案:

答案 0 :(得分:4)

  在@符号之前

应该有一个空格

您可以使用lookbehind(根据下面的OP评论编辑):

preg_match('/(?<= |^)@[^@ ]+/', $image->caption->text, $matches);

Working Demo

答案 1 :(得分:1)

我的看法:

preg_match('/(?<=\W|^)@(\w+)/', "@Easy? No.@anubhava try harder! @\t", $matches);
preg_match('/(?<=\W|^)@(\w+)/', "Easy? No.@anubhava try harder! @\t", $matches);
preg_match('/(?<=\W|^)@(\w+)/', "Easy? No.anubhava try harder! e@m @\t", $match);

正确识别 @Easy @anubhava ,而不是标签或电子邮件。

答案 2 :(得分:0)

你可以使用外观来检查你的正则表达式。

尝试使用:preg_match('/(?<![^\s])@([^@\s]+)/', $image->caption->text, $matches);

此处需要注意的重要一点是,您还希望在\s之后检查的班级中使用@。如果没有,您最终可能会匹配@stuff<NEWLINE><nonmatch>。我做了一些快速测试,并且由于多种原因发现了使用空间的问题。 Here is a link to the tests

这也是背后的负面看法,因为如果提到位于字符串的前面,那么使用后面的正面外观将无法匹配。你必须在积极的比赛前面考虑空白。

我认为仅仅检查一个空间可能会有风险。我想你可能想要检查任何空格字符,以防提及是在字符串的最开头。