我试图理解这个正则表达式模式的错误:
'/^[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_会匹配.
祝你有愉快的一天,感谢所有:)
不要试图把它全部塞进一个正则表达式.让您的生活更简单,并采用两步法:
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)
断言断言长度,第二部分确保至少存在一个字母.