【问题标题】:stating number of characters in regex说明正则表达式中的字符数
【发布时间】:2012-10-18 16:04:45
【问题描述】:

我希望用户名长度为 4-32 个字符。

function validate_username($input)
{
    return (bool) preg_match('/^([a-z]+[a-z0-9_]*){4,32}$/i', $input);
}

请问我的尝试有什么问题?

var_dump(validate_username('h_q8Y')); 返回FALSE

但是var_dump(validate_username('h_q8Yewre_')); 返回TRUE

【问题讨论】:

  • 为什么不这样呢? $l = strlen($输入); if(4
  • 你也想匹配大写字符吗?
  • @full.stack.ex 你是对的,但我更喜欢使用正则表达式样式的长度检查器。
  • 是的,我想要它@shiplu.mokadd.im。

标签: php regex validation


【解决方案1】:

您的正则表达式错误。这里

  • ([a-z]+[a-z0-9_]*) 匹配 h_q8Y
  • 那么{4,32} 表示将有至少4 个最多32 个h_q8Y。但是您只提供了一个h_q8Y

因此它不起作用。

最好使用下面的表达式。

/^[a-z]\w{3,31}$/i

【讨论】:

    【解决方案2】:

    {4,32} 重复内括号匹配 4 次。您至少需要 4 个字母才能满足。

    要断言长度,您需要一个独立于字符类说明符的前瞻断言:

     preg_match('/^(?=.{4,32})([a-z]+[a-z0-9_]*)$/i'
    
                       |             |
                 asserts length      |
                                checks char mix
    

    【讨论】:

    • +1 但这对于这里实际需要的内容来说有点过于复杂 - 为什么不验证第一个字符,然后验证剩余的 {3,31} 字符?
    • 这允许大写字母吗?我认为它们必须用 A-Z 来指定?
    • @MrFox /i 标志使其不区分大小写
    • @DaveRandom:是的,在这种情况下有点不必要。但我认为,尽管有语法开销,但将条件拆分对 OP 来说不会那么混乱。他只是混淆了适用于团体的地方。
    • 亲爱的@mario 非常感谢您的回答。希望我可以将所有三个答案都设置为正确答案!你给了我我真正想要的东西。
    【解决方案3】:

    您正在重复 4 到 32 次。我假设您想确保用户名以字母开头。在这种情况下,这可能就是您要查找的内容:

    preg_match('/^[a-z]\w{3,31}$/i', $input);
    

    注意\w 等同于[a-zA-Z0-9_]

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2013-07-10
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      相关资源
      最近更新 更多