我有以下JavaScript函数:
function checkPassword(password) {
if (password.match(/[A-Z]/)
&& password.match(/[a-z]/)
&& password.match(/[0-9]/)
&& password.match(/[£:#@~\.,|(etc....)]/)
&& password.length >= 6) {
return true;
} else {
return false;
}
}
我想要做的是更改它,以便当密码长度超过16时,只需要3个大写,小写,数字和符号以及超过32个字符长只需要2个字符类型。我该怎么做呢?
这是我迄今为止所拥有的,但它似乎很大,我相信必须有更好,更有效或至少更整洁的方式:
function checkPassword(password) {
var matched = 0;
if (password.match(/[A-Z]/)) {
matched++;
}
if (password.match(/[a-z]/)) {
matched++;
}
if (password.match(/[0-9]/)) {
matched++;
}
if (password.match(/[£:#@~\.,|(etc....)]/)) {
matched++;
}
if (matched >= 4 && password.length >= 6) {
return true;
}
if (matched >= 3 && password.length >= 16) {
return true;
}
if (matched >= 2 && password.length >= 32) {
return true;
}
return false;
}
我认为我的问题是,我需要检查两个变量matched
和password.length
。
答案 0 :(得分:1)
计算它匹配的字符类型类别的数量,并将其添加到Math.floor(password.length/16.0)
(即,整个次数16进入密码)。然后,检查总值是否至少为4.这仍然需要代码的第一部分:
function checkPassword(password) {
var matched = 0;
if (password.match(/[A-Z]/)) {
matched++;
}
if (password.match(/[a-z]/)) {
matched++;
}
if (password.match(/[0-9]/)) {
matched++;
}
if (password.match(/[£:#@~\.,|(etc....)]/)) {
matched++;
}
......但其余的更简单,只留下一个条件来检查:
matched += Math.floor(password.length/16.0);
if (matched >= 4 && password.length > 6) {
return true;
}
return false;
}
如果你想进一步缩短它,可以将你的正则表达式放在一个列表中并循环它们。
请记住,如果密码不够好,这将使您难以向用户解释缺少的内容:通常显示特定于缺少用户密码的错误消息(例如大写字母) ,符号等)。你不会有这个,因为你不会知道它们缺少什么(并且它们有多种选择来修复它,因此它们并没有真正丢失它们的特定事物)。如果你想显示好的,特定的错误信息,你就会遇到长代码。
答案 1 :(得分:1)
我不得不对此提出更多想法,但是这样的伎俩如何:
var password = "S0m3p@ssword";
var count= 0;
var r = password.replace(/([A-Z])|([a-z])|([0-9])|([£:#@~\.,])/g,function(match,upperChars,lowersChars,numbers,specialChars){
count = count +1;
if (count >= 4 && password.length >= 6) {
return "match1";
}
if (count >= 3 && password.length >= 16) {
return "match2";
}
if (count >= 2 && password.length >= 32) {
return "match3";
}
return "";
});
console.log(r);
在上面的示例中,如果r.length > 0
,则表示密码有效。