用于匹配用户名

时间:2016-06-09 22:09:55

标签: php regex laravel

我正在开发一个laravel应用程序,用户可以通过将其用户名设置为适当的形式来引用他的个人资料。

让我们看一个例子:

名为John的用户可以使用以下文本引用他的个人资料:@John

我花了几个小时试图了解正则表达式是如何工作的,但这种模式是我到目前为止的地方:@([A-Za-z0-9]+)

此模式与上面的示例完全匹配,但它也匹配通常不应该使用的其他格式。

我需要一些帮助来创造完美的模式。

它应该只匹配以@符号开头的字符串。 例如:@ John,@ Sam,@ Bill等

它不应与不以@符号开头的字符串匹配。 例如:@ John,@ Sam,123 @ Bill等等。

它还应匹配包含多个@符号的格式。 例如:@ John @,@ Sam @ something,@ Bill @@ sometext等。 在这种情况下,模式应该捕获:John @,Sam @ something,Bill @@ sometext

感谢您的帮助,抱歉我的英语不好。

3 个答案:

答案 0 :(得分:4)

这应该有效:

(?<=\s|^)@([\w@]+)

有一个积极的lookbehind断言,以确保标记前面有空格或字符串的开头。之后,只是消耗@字符并将用户名放入捕获组中。

Regex demo

答案 1 :(得分:0)

你的正则表达式几乎是正确的。 首先,你想说你的正则表达式也应该匹配字符串的开头。你可以用插入符号(^)来实现它:

^@([A-Za-z0-9]+)

其次,您希望能够将@符号放入其中。现在它很简单 - 只需在括号内添加该符号即可。

^@([A-Za-z0-9@]+)

答案 2 :(得分:-1)

尝试/(?:\s@{1,3})([a-zA-Z@.]+)/i

<强>解释

@ Character。匹配&#34; @&#34;字符(字符代码64)。 {1,3}量词。匹配前面标记的1到3之间。

\ w Word。匹配任何单词字符(字母数字和下划线)。 +加号。匹配前面标记中的1个或多个。

这是regexr:http://regexr.com/3djhq