我有以下代码:
preg_match('/@([^@ ]+)/', $image->caption->text, $matches)
我想基本上检测字符串中的提及。但是现在的问题是它与电子邮件地址混淆,因此它会将电子邮件检测为提及,例如,如果我有aksdjasd@yahoo.com
,那么这将被视为匹配。我想我想说的是在@符号之前应该有一个空格。但是我如何把它放到这个正则表达式中呢?
修改 我也想在字符串的开头检测@mentions
答案 0 :(得分:4)
在@符号之前应该有一个空格
您可以使用lookbehind(根据下面的OP评论编辑):
preg_match('/(?<= |^)@[^@ ]+/', $image->caption->text, $matches);
答案 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
这也是背后的负面看法,因为如果提到位于字符串的前面,那么使用后面的正面外观将无法匹配。你必须在积极的比赛前面考虑空白。
我认为仅仅检查一个空间可能会有风险。我想你可能想要检查任何空格字符,以防提及是在字符串的最开头。