[英]How to construct a regex expression for username validation?
我正在为具有以下约束的用户名验证构造PHP regex表达式:
-长度必须为10-16个字符,并且由字母,数字和至少一个特殊字符(*&^ -_ $$)组成-不能以数字或特殊字符开头
更正:最后的MMYYYY format
数字必须是一个月/日期生日( MMYYYY format
)。 为了进一步验证用户名,月份/日期必须显示用户名超过18-如果不是,则用户名将不验证。 预先感谢您的协助! 我已经坚持了一段时间。
您可以使用以下正则表达式执行此操作:
/(?=^.{10,16}$)(?=.+?[*&^_$-])[a-z].+?[01]\d{3}$/i
/
分隔符 (?=^.{10,16}$)
确保有10-16个字符,从头到尾
(?=
启动前瞻组 ^
字符串的开头 .{10,16}
十到十六个字符 $
字符串结尾 )
结束超前组 (?=.+?[*&^_$-])
确保集合*&^_$-
中至少有一个特殊字符,并且不是第一个
(?=
启动前瞻组 .+?
一个或多个字符,非贪婪 [*&^_$-]
集合*&^_$-
中的任何字符(请注意顺序;您必须将-
放在首位或最后一位,或将其转义为\\-
) )
结束超前组 [az]
以字母开头 .+?
以非贪婪的方式匹配任何字符,并根据需要返回 [01]\\d{3}
匹配0
或1
然后再匹配3个数字 $
匹配字符串的结尾 /
结束定界符 i
使比赛不区分大小写 请注意,有多种有效的方法可以执行此操作。 为了提高效率,可以稍微简化上述解决方案,以减少处理器的几个步骤。
但是出于可读性考虑,我喜欢上面的内容。 很清楚每个块,字符集或组的作用,这使其可读性和可维护性。
像/^[az](?=.*?[*&^_$-])[a-z0-9*&^_$-]{5,11}[01]\\d{3}$
是难以阅读和理解。 如果要允许使用17个字符的用户名怎么办? 您必须进行一堆数学运算才能确定应将{5,11}
更改为{5,12}
。 或者,如果您决定允许字符#
,则必须在两个位置添加它(顺便说一句,这意味着正则表达式已经违反了DRY原理 )。
您在评论中说,您尝试过此操作:
(?=^.{10,16}$)^[a-z][\d]*[_$^&*]?[a-z0-9]+
第一部分(?=^.{10,16}$)
很好。 ^[az]
。
但是[\\d]*
仅匹配零个或多个数字; 它与字母或特殊字符不匹配。 因此,例如, a&a...
将失败。
还有[_$^&*]?
只匹配零个或一个特殊字符。 它将允许不带特殊字符的用户名通过,但会失败但不带2个特殊字符的用户名。
[a-z0-9]+
仅匹配那些字符,并且您省略了最后四个字符必须为数字的要求。
您可能会在regex101.com上找到有关regex的说明很有帮助。 (注意:我与该网站没有任何隶属关系。)
您可以使用此正则表达式:
^[a-zA-Z](?=.*[*&^_$-])[\w*&^$-]{5,11}[01]\d{3}$
正则表达式分手:
^ # Line start
[a-zA-Z] # # match an alhpabet
(?=.*[*&^_$-]) # lookahead to ensure there is at least one special char
[\w*&^$-]{5,11} # match 5 to 11 of allowed chars
[01]\d{3} # match digits 0/1 followed by 3 digits
$ # Line end
我使用了量词{5,11}
因为一个字符在开始时是匹配项,而在结尾处是4个字符,因此从所需的{10,16}
长度中取出5个位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.