正则表达式验证密码

时间:2013-02-05 01:31:18

标签: javascript html regex

  

可能重复:
  Password validation regex

8到16个字符,每个3个字符类别中至少有1个字符 - 字母大写和小写,数字,符号。

我有这个代码,但它不起作用,当我写超过16个字符时,它给它有效,但它不应该;它应该适用于3个字符类,但它适用于4,这是我的错误?

http://jsbin.com/ugesow/1/edit

<label for="pass">Enter Pass: </label>
<input type="text" id="pass" onkeyup="validate()">

脚本

function validate() {
    valor = document.getElementById('pass').value;
    if (!(/(?=.{8,16})(?=.*?[^\w\s])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*/.test(valor))) {

        document.getElementById('pass').style.backgroundColor = "red";
    } else {
        document.getElementById('pass').style.backgroundColor = "#adff2f";
    }
}

4 个答案:

答案 0 :(得分:1)

正则表达式不是灵丹妙药。与常规代码混合起来并不难:

function validatePassword(password) {
    // First, check the length.
    // Please see my comment on the question about maximum password lengths.
    if(password.length < 8 || password.length > 16) return false;
    // Next, check for alphabetic characters.
    if(!/[A-Z]/i.match(password)) return false;
    // Next, check for numbers.
    if(!/\d/.match(password)) return false;
    // Next, check for anything besides those.
    if(!/[^A-Z\d]/i.match(password)) return false;
    // If we're here, it's valid.
    return true;
}

但是,我会查看类似zxcvbn的密码检查程序,我认为这是一种更好的密码质量检查程序,在取消13375p3/-\k ification和{{dealing with entropy decently之后检查常见词典单词之类的内容3}}。它由Dropbox使用。 Try it here.

答案 1 :(得分:0)

您需要将匹配锚定到字符串的开头,并将第一个前瞻锚定到结尾:

^(?=.{8,16}$)

此外,最后一个前瞻需要分成两部分:

(?=.*?[A-Z])(?=.*?[a-z])

答案 2 :(得分:-3)

为什么不用正则表达式测试三个字符集:

[A-Za-z0-9]+

然后计算字符串的长度以验证长度。

答案 3 :(得分:-3)

这个范围怎么样:

/[A-Za-z0-9$-/:-?{-~!"^_`\[\]]/

所以你可以先检查

/[A-Za-z]+/ 

然后

/\d+/ 

最后

/[$-/:-?{-~!"^_`\[\]]+/  

如果通过,你可以检查长度。

您可以看到此link以查看符号的工作原理。