Php 用于验证用户名的正则表达式
我试图理解这个正则表达式模式的错误:Php 用于验证用户名的正则表达式,php,regex,Php,Regex,我试图理解这个正则表达式模式的错误: '/^[a-z0-9-\.]*[a-z0-9]+[a-z0-9-\.]*{4,20}$/i' 我要做的是验证用户名。允许的字符有字母数字、破折号、下划线和点。我试图实现的限制是至少有一个字母数字字符,这样用户就不允许有这样的昵称:\uu-。 我现在使用的功能是: function validate($pattern, $string){ return (bool) preg_match($pattern, $string); } 谢谢 编辑 正如@
'/^[a-z0-9-\.]*[a-z0-9]+[a-z0-9-\.]*{4,20}$/i'
我要做的是验证用户名。允许的字符有字母数字、破折号、下划线和点。我试图实现的限制是至少有一个字母数字字符,这样用户就不允许有这样的昵称:\uu-。
我现在使用的功能是:
function validate($pattern, $string){
return (bool) preg_match($pattern, $string);
}
谢谢
编辑
正如@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
在这种情况下,\u这是我-
将不匹配,但\u这是我
将匹配
祝您度过愉快的一天,感谢所有人:)这可能只是微调的问题,您可以尝试以下方法:
if (preg_match('/^[a-zA-Z0-9]+[_.-]{0,1}[a-zA-Z0-9]+$/m', $subject)) {
# Successful match
} else {
# Match attempt failed
}
匹配项:
- a_b试试这个:
试试这个:'/[a-z0-9-_\.]*[a-z0-9]{1,20}[a-z0-9-_\.]*$/i'
^[a-zA-Z][-\w.]{0,22}([a-zA-Z\d]|(?<![-.])_)$
^[a-zA-Z][-\w.]{0,22}([a-zA-Z\d]|(?
从相关问题:我很清楚,您应该将此拆分为两张支票 首先检查他们是否使用了所有有效字符。如果他们没有,那么你可以告诉他们使用了无效字符 然后检查它们是否至少有一个字母数字字符。如果没有,则可以告诉它们必须
这里有两个明显的优点:给用户更有意义的反馈,以及更清晰的代码阅读和维护。不要试图将其全部塞进一个正则表达式中。让您的生活更简单,并使用两步方法:
正则表达式中的错误可能是return (bool) preg_match('/^[a-z0-9_.-]{4,20}$/', $s) && preg_match('/\w/', $s);
和*
的混合。这些量词中只能有一个,而不是{n,m}
*{4,20}
很好,下面是您想要的麻烦解决方案:preg_match('/^(?=.{4})(?!.{21})[\w.-]*[a-z][\w-.]*$/i', $s)
断言断言长度,第二部分确保至少有一个字母存在。这里有一个简单的单一正则表达式解决方案(详细):
行动中(简称):$re='/#匹配至少有一个alphanum的密码。 ^#锚定至管柱起点。 (?=..[A-Za-z0-9])#至少一个字母编号。 [\w\-.]{4,20}#匹配4到20个有效字符。 \z#锚定在绳子的末端。 /x′;
这将验证用户名函数验证($string){ $re='/^(?=.*A[A-Za-z0-9])[\w\-.]{4,20}\z/'; 返回(bool)预匹配($re,$string); }
- 从阿尔法开始
- 接受下划线破折号和点
- 不允许有空格
你为什么不这样简单点?^[a-zA-Z][a-zA-Z0-9\.[3,9}
- 第一个字母应该按字母顺序排列
- 然后后跟允许的字符或符号
- 单词的长度应在4,10之间(明确强制第一个单词)
,-
或
一起:)最后一个IDEA会处理这个:-
/^(?=.{4,20}$)[a-z0-9]{0,1}([a-z0-9.-][a-z0-9]+*)*[a-z0-9.-{0,1$/I
<我说过不要以字母或数字开头,你的正则表达式实际上是什么,但至少要包含一个字母或数字,这就是为什么我把[a-z0-9]+在midle中。是的,这会起作用,剩下的唯一问题是检查用户名的长度。什么时候
是不可能的?因为我使用的是带有模式的类。作为第一步,检查用户名是否以字母开头,这不正是我要做的。这会增加复杂性。是的,这会增加复杂性现在还不是世界末日,但这并不是真的需要一个复杂的正则表达式来分割它。正如我之前所说,我有一个包含模式的类验证器,我真的不想让事情复杂化,并在那里实现两步验证。@s3v3n:我尊重地不同意。这将消除复杂性。你已经把事情复杂化了事实证明,您的正则表达式并没有达到您所希望的效果,您正在“试图理解哪里出了问题”。我同意Johnsyweb。如果接下来要验证文件输入,该怎么办?很难找到用于上传错误、0字节文件等的正则表达式。这种体系结构对您的限制太多了。它现在可能可以工作,但如果您想更深入,该怎么办?请参阅我对Johnsyweb答案的评论,以了解为什么我不能(也不想)这样做把它分成两张支票。是的,现在我清楚地看到pstrlen
^[A-Za-z][A-Za-z0-9]*(?=.{3,31}$)[a-z0-9]{0,1}([a-z0-9._-][a-z0-9]+)*[a-z0-9.-_]{0,1}$