完善查找@username标记的正则表达式

时间:2013-03-15 15:28:32

标签: php regex

我正在使用一个系统获取@twitter之类的名字,以下正则表达式接近完美:

(?<![^\s<>])@([^\s<>]+)

我发现的问题是名字后面是否有标点符号

例如:

  • 嘿@mark ===&gt;匹配@mark (这就是我们想要的)
  • 嘿@mark。 ===&GT;匹配@mark。
  • 嘿@mark,你很好===&gt;匹配@mark,
  • 嘿@mark !!!!我没想到===&gt;匹配@mark !!!!

显然我们只想匹配用户名而不是标点符号。需要注意的是,某些用户名在用户名中有这些句点,例如

例如,这些都是合法的用户名

mark.markus

mark@gmail.com

mark_markus@gmail.com

编辑我们正在使用lookbehind,如果上面的用户名与@ infront一起使用,它们应该匹配,但如果没有@在前面那么电子邮件地址实际上应该不匹配。 @ mark_markus @ gmail.com应匹配mark_markus@gmail.com,但如果有人输入普通的旧标记mark_markus@gmail.com,我们不希望gmail.com匹配。

有关如何修改正则表达式以解释可以使用的各种标点符号的任何想法?

1 个答案:

答案 0 :(得分:4)

怎么样:

(?<![\w@])@([\w@]+(?:[.!][\w@]+)*)

我已将[^\s<>]替换为[\w@],这有点限制性。 \w匹配字母,数字和下划线。如果您特别需要允许其他任何字符,请将它们添加到每个字符类中。

此群组:(?:\.\w+)*允许一个或多个句点成为用户名的一部分,但前提是它们后面紧跟着字符。请注意,(?:...)是非捕获组。当您想出于逻辑目的对事物进行分组时,它非常有用,但不需要捕获结果。

更新: see a working example

相关问题