正则表达式 - 连续符号

时间:2012-01-22 00:44:28

标签: php regex

我想知道是否可以创建一个正则表达式来检查用户名是否有效,具体取决于以下规则:

  • 3到12个字符
  • 可以包含大写和/或小写字符
  • 可以包含数字字符
  • 可以有'_'和' - '符号

我知道如何执行上述操作,但我想在同一个正则表达式中检查的是用户名是否包含连续符号(例如user__name或user-name)

这可能还是需要2次正则表达式检查?

4 个答案:

答案 0 :(得分:2)

如果有任何代码可读性,那么最好使用两次正则表达式检查。正则表达式已经难以阅读,你不需要通过制作一个复杂的正则表达式而不是两个简单的正则表达式来使自己变得更难。

preg_match("(^[a-zA-Z0-9_-]{3,12}$)",$username) && !preg_match("([-_]{2})",$username)

答案 1 :(得分:0)

(?=[a-zA-Z0-9_-]{3,12})(?!.*[-_]{2,})

可能有效

答案 2 :(得分:0)

尝试以下方法:

preg_match('^(?:([a-zA-Z0-9_-])(?!\1)){3,12}$', $username);

检查所有字符是否为字母,数字,_或 - ,以及之后是否为同一个字母。 (?!\1)表示“匹配后来的字符串与第一个捕获子模式((?! ... ))不相等(\1),在这种情况下为[a-zA-Z0-9_-]

答案 3 :(得分:0)

如果我们以文本方式分解您的表达,您的表达式会分解为:

^                    start of input
[_-]?                optional _ | - at the start
[a-zA-Z0-9]+         at least a number of alphanumeric characters
([_-][a-zA-Z0-9]+)*  followed an optional repeating group of _ | - and more alphanumerics
[_-]?                optional _ | - at the end.
$                    end of input

正如您所看到的那样,如果您严格遵守文本格式的方式,则无需查看或验证您的要求。

此表达式不考虑用户名的长度,通常更容易添加第二个验证来检查。

可选地,您可以在^之后放置(?=。{3,12} $)以将长度验证合并到表达式中。

^                    start of input
(?=.{3,12}$)         length validation
[_-]?                optional _ | - at the start
[a-zA-Z0-9]+         at least a number of alphanumeric characters
([_-][a-zA-Z0-9]+)*  followed an optional repeating group of _ | - and more alphanumerics
[_-]?                optional _ | - at the end.
$                    end of input