正则表达式验证用户名

s3v*_*v3n 2 php regex

我试图理解这个正则表达式模式的错误:

'/^[a-z0-9-_\.]*[a-z0-9]+[a-z0-9-_\.]*{4,20}$/i'

我要做的是验证用户名.允许的字符是字母数字,短划线,下划线和点.我试图实现的限制是至少有一个字母数字字符,因此不允许用户拥有像这样的昵称:_-_.

我现在使用的功能是:

function validate($pattern, $string){
    return (bool) preg_match($pattern, $string);
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

编辑

正如@mario所说,是的,这是一个问题*{4,20}.我现在尝试做的是添加,( )但这不是例外:

'/^([a-z0-9-_\.]*[a-z0-9]+[a-z0-9-_\.]*){4,20}$/i'

现在它匹配'aa - aa',但它与'aa - '和'--aa'不匹配.还有其他建议吗?

编辑

也许有人想否认像" _ .. -a" 这样不好看的用户名.这个正则表达式将拒绝连续的非字母数字字符:

/^(?=.{4,20}$)[a-z0-9]{0,1}([a-z0-9._-][a-z0-9]+)*[a-z0-9.-_]{0,1}$/i

在这种情况下_-this-is-me-_不匹配,但_this-is-me_会匹配.

祝你有愉快的一天,感谢所有:)

mar*_*rio 6

不要试图把它全部塞进一个正则表达式.让您的生活更简单,并采用两步法:

return (bool)
 preg_match('/^[a-z0-9_.-]{4,20}$/', $s) && preg_match('/\w/', $s);
Run Code Online (Sandbox Code Playgroud)

在正则表达式中的错误可能是的查询股价*{n,m}.你只能拥有其中一个量词,而不是*{4,20}一个接一个.


很好,这是你想要的麻烦的解决方案:

 preg_match('/^(?=.{4})(?!.{21})[\w.-]*[a-z][\w-.]*$/i', $s)
Run Code Online (Sandbox Code Playgroud)

断言断言长度,第二部分确保至少存在一个字母.

  • @ s3v3n:很有意思.我不知道你能做到这一点.PCRE对于可变长度断言严格要求.但要注意`[\ w]`也匹配下划线与`[a-z0-9]`相对照. (2认同)