0

可能重复:
密码验证正则表达式

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

4 回答 4

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这样的密码检查器,我认为它是一个更好的密码质量检查器,在 un- 13375p3/-\k 化之后检查常见的字典单词并妥善处理熵。它被 Dropbox 等使用。在这里试试。

于 2013-02-05T01:52:41.543 回答
0

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

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

此外,最后的前瞻需要一分为二:

(?=.*?[A-Z])(?=.*?[a-z])
于 2013-02-05T01:46:58.580 回答
-3

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

[A-Za-z0-9]+

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

于 2013-02-05T01:37:31.653 回答
-3

这个范围怎么样:

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

所以你可以先检查

/[A-Za-z]+/ 

然后

/\d+/ 

最后

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

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

您可以查看此链接以了解符号工作的原因。

于 2013-02-05T01:44:23.583 回答