Php 可靠的昵称regexp

Php 可靠的昵称regexp,php,regex,Php,Regex,我想要一个正则表达式来验证昵称:6到36个字符,它应该至少包含一个字母。其他允许的字符:0-9和下划线 这就是我现在拥有的: if(!preg_match('/^.*(?=\d{0,})(?=[a-zA-Z]{1,})(?=[a-zA-Z0-9_]{6,36}).*$/i', $value)){ echo 'bad'; } else{ echo 'good'; } 这似乎是可行的,但当验证此字符串时,例如: 11111 A>无效,但应为 啊啊!aaaa>是有效的,但不应该 有什么办法让这个

我想要一个正则表达式来验证昵称:6到36个字符,它应该至少包含一个字母。其他允许的字符:0-9和下划线

这就是我现在拥有的:

if(!preg_match('/^.*(?=\d{0,})(?=[a-zA-Z]{1,})(?=[a-zA-Z0-9_]{6,36}).*$/i', $value)){
 echo 'bad';
}
else{
 echo 'good';
}
这似乎是可行的,但当验证此字符串时,例如:

11111 A>无效,但应为 啊啊!aaaa>是有效的,但不应该


有什么办法让这个regexp更好吗?

我会把你的任务分成两个regex:

  • 要确定它是否是一个有效的单词:
    /^\w{6,36}$/i
  • 要了解它是否包含字母
    /[a-z]/i
  • 我认为这样更简单。

    试试这个:

    '/^(?=.*[a-z])\w{6,36}$/i'
    

    以下是原始正则表达式的一些问题:

    /^.*(?=\d{0,})(?=[a-zA-Z]{1,})(?=[a-zA-Z0-9_]{6,36}).*$/i
    
    • (?=\d{0,})
      :这是干什么用的???这永远是真的,没有任何作用
    • (?=[a-zA-Z]{1,})
      :您不需要
      {1,}
      部分,只需找到一个字母,
      i
      标志也允许您省略
      a-Z
    • /^.*
      :您在环视之外匹配这些;应该在里面
    • (?=[a-zA-Z0-9{6,36})。*$
      :这意味着只要有6-36个
      \w
      字符,其余字符串中的所有字符都匹配!该字符串可以是100个字符长,大部分包含非法字符,它仍然会匹配
    您可以使用两个调用轻松地进行预匹配,如下所示:

    if( preg_match('/^[a-z0-9_]{6,36}$/i',$input) && preg_match('/[a-z]/i',$input)) {
     // good
    } else {
    // bad
    }
    

    您可以省略
    A-Z
    ,或
    i
    标志。建议合并。谢谢。有点晚了:这是SilentGhost答案的复制品。