【问题标题】:Regex to validate username not working正则表达式验证用户名不起作用
【发布时间】:2014-06-12 02:28:21
【问题描述】:

我有这个正则表达式:

/^[A-z0-9\._-]{3,24}+$/i

这应该只匹配长度在 3 到 24 个字符之间的字符串,并且只匹配字符 a-z、A-Z、0-9 以及 . _ 和 - 字符。

问题是这也匹配像“^_^”这样的字符串。有人刚刚创建了一个用户名,所以这绝对是一个问题!谁能发现我的正则表达式的问题?

【问题讨论】:

  • 根据regexr,您的模式有语法错误;奇怪为什么 PCRE 似乎并不关心它。

标签: php regex


【解决方案1】:

使用这个正则表达式:

/^[\w.-]{3,24}$/

A-z[A-Za-z] 不同,因为它还包含其他字符,例如 ^(感谢 Jack)

还要删除{3,24} 之后的额外量词+,这意味着整个字符串的一个或多个实例。

PS:我还缩短了您的正则表达式以使用 \w 而不是 [A-Za-z0-9_]

【讨论】:

  • 太棒了。又好又简单!谢谢。我必须再等几分钟才能接受答案。
  • 实际上,+ 没有不良影响(即使它不应该存在)。您“掩盖”为缩短正则表达式 is 实际上是修复,因为 A-z 范围包括 ^ :)
  • @Jack:谢谢我忽略了那部分,在我的回答中添加了。
  • 哇,我以为 A-z 是 a-z 和 A-Z。 A-z 中是否包含所有特殊字符?
  • A-z 包括 ASCII 表中 65 到 122 范围内的所有字符
【解决方案2】:

您不需要+,因为您使用{3,24} 指定长度范围

/^[A-z0-9\._-]{3,24}$/i

正如在下面的 cmets 中所指出的,A-z 也匹配 ^ 字符。在这种情况下A-Za-z 会更好;但是,上面\w.- 的答案是迄今为止最优雅的。

【讨论】:

  • 这仍然匹配"^_^"
  • 你是对的,在这种情况下我不应该使用 A-z,而是 A-Za-z。但是,坦率地说,无论如何,我认为@anubhava 的回答更优雅。
猜你喜欢
  • 2021-06-18
  • 2018-11-29
  • 2014-04-21
  • 1970-01-01
  • 2016-08-01
  • 2011-03-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
相关资源
最近更新 更多