Javascript 随着密码长度的增加,放宽密码复杂性要求

Javascript 随着密码长度的增加,放宽密码复杂性要求,javascript,passwords,Javascript,Passwords,我有以下JavaScript函数: function checkPassword(password) { if (password.match(/[A-Z]/) && password.match(/[a-z]/) && password.match(/[0-9]/) && password.match(/[£:#@~\.,|(etc....)]/) && passwo

我有以下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;
}

我认为我的问题在于,我有两个变量
匹配
密码.length
,我需要检查它们的值。

计算它匹配的字符类型类别的数量,并将其添加到
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;
}
如果你想进一步缩短它,你可以把你的正则表达式放在一个列表中,然后在上面循环


请记住,如果用户的密码不够好,您将很难向用户解释丢失了什么:通常,显示一条特定于用户密码丢失内容的错误消息(例如大写字母、符号等)会很有帮助。你不会有这个,因为你不知道他们遗漏了什么(而且他们有多个选项来修复它,所以他们没有遗漏什么)。如果您想显示好的、特定的错误消息,那么代码就太长了。

我必须对此给出额外的想法,但下面的技巧如何:

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);

在上面的示例中,if
r.length>0
表示密码有效。

似乎需要某种类型的if-else。。。