Php 用于检测提及但不检测电子邮件的正则表达式

Php 用于检测提及但不检测电子邮件的正则表达式,php,regex,Php,Regex,我有以下代码: preg_match('/@([^@ ]+)/', $image->caption->text, $matches) 我想基本上检测字符串中的提及。但是现在的问题是,它与电子邮件地址混淆,因此它会将电子邮件检测为提及,例如,如果我有aksdjasd@yahoo.com则此项视为匹配项。我想我想说的是在@符号之前应该有一个空格。但是我怎么把它放到这个正则表达式中呢 编辑: 我还想在字符串的开头检测@提及 在@标志前面应该有一个空格 您可以使用Lookback(根据OP

我有以下代码:

preg_match('/@([^@ ]+)/', $image->caption->text, $matches)
我想基本上检测字符串中的提及。但是现在的问题是,它与电子邮件地址混淆,因此它会将电子邮件检测为提及,例如,如果我有
aksdjasd@yahoo.com
则此项视为匹配项。我想我想说的是在@符号之前应该有一个空格。但是我怎么把它放到这个正则表达式中呢

编辑: 我还想在字符串的开头检测@提及

在@标志前面应该有一个空格

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


preg_match('/(?您可以使用look behinds检查正则表达式后面的内容

尝试使用:
preg_match('/(?My take:

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

preg_匹配('/(?我们的答案都没有将字符串开头的提到作为第一件事,因为正面的后面看是失败的。@Walls:我故意不允许这样做,因为OP清楚地写道:
在@符号之前应该有一个空格
我认为除了“before space”之外,原始正则表达式还有一些问题部分。我只是想让大家知道,有一些奇怪的互动与所要求的内容,以及我认为OP正在寻找的内容。特别是寻找提及(例如Twitter)可能有字符串/提及以用户正在寻找的标签开始。对我来说也不够好。
preg_match('/(?@Walls这实际上是一个很好的观点,我实际上想检测字符串开头的提及,以及尝试以下内容:'@first@secondemail@domain.com@垃圾是的。@Other reference\'@\'@“tricky@”似乎只匹配
@first
@second
。问题是检查“电子邮件”只需确保@符号弱之前没有任何内容,特别是因为仅使用正则表达式验证电子邮件可能是一个棘手的问题。理论上,你可以在负片后面添加更多内容来解释错误的标点符号。例如,如果你想在句点后捕获
@Other
,请在负片中添加句点e回头看(双重否定:)。你们太怕事了。@adit已经接受了线的开头。我想说@anubhava还有4个问题需要解决:
(@foo nice try)@adit good“@[bad@]
。在他的工作演示中试试。
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);