我通过正则表达式进行密码验证。这是我的表达式:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
它有效 - 密码必须至少包含1位数,至少1个小写字母,至少1个大写字母和至少特殊字符:@#$%^&+=
。所以我必须输入所有这些字符。
但是我想要密码,它至少有3个组合,而不是全部4个 所以这些密码应该是好的:
2Df
(非特殊字符),dF#
(非数字),a4%
(非大写)。我想问一下,这个正则表达式应该怎么样?我可以编写每个表达式来检查每个组合,例如:
^(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
^(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=]).*$
但也许我可以用一个表达式来做。
答案 0 :(得分:3)
为什么你使用正则表达式?只需遍历您的密码字符串并计算所需字符类型的数量。在PHP中,您可以使用count_chars()
等函数。
伪代码:
foreach(password as char) {
if (is_digit(char))
digits++;
if (is_specialchar(char))
special++;
if (is_lower(char))
lower++;
if (is_upper(char))
upper++;
//etc
}
现在您可以定义任何您想要的要求
if (dgits > 0) and (lower > 0) and (special > 0)
passowrd_ok()
else
password_bad()
在你的情况下,你可以聪明地计算
if (lower > 0)
diversity++;
if (upper > 0)
diversity++;
if (special > 0)
diversity++;
if (digit > 0)
diversity++;
if (diversity >= 3) //at least 3 different types of characters in password
pass_ok()
答案 1 :(得分:1)
如果你必须使用正则表达式,我建议(为了清楚起见)检查所有四个条件。为了便于阅读,您可以首先尝试在密码中找到\d
,然后[a-z]
,然后[A-Z]
,然后[@#$%^&+=]
(尽管您可能希望使用[\W_]
而是允许不仅仅是那些额外的字符)。然后检查其中至少有三个是否有效。
如果 在单个正则表达式中执行此操作,则可以使用替换:
^((?=.*[a-z])(?=.*[A-Z])(?=.*\d)|(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])|(?=.*[\W_])(?=.*[A-Z])(?=.*\d)|(?=.*[a-z])(?=.*[\W_])(?=.*\d)).*$
但这只是丑陋。