Javascript密码验证至少2位数字

时间:2015-09-12 01:02:20

标签: javascript

我正在尝试使用以下条件为密码编写javascript验证:

密码必须:

  • 正好有8个字符
  • 包含字母和数字
  • 至少包含两个数字

EG:  “helloo15”,“1helloo5”和“h1111111”有效,“helloo1500”,“27272727”和“helloos5”无效。

这就是我目前所拥有的:

//Password
    var pw = document.myForm.password1.value;
    var Vpw = /^[a-zA-Z0-9]{8}$/;
    if (!Vpw.test(pw)) {
        alert("Password must be 8 digits long. It must include a maximum of two numbers.");
        return false;           
    } else {
/*      alert("Valid CCV!");     */     
    }

但我无法弄清楚如何将它限制在字符串中的任何位置至少2个数字。谢谢!

3 个答案:

答案 0 :(得分:1)

尝试这个

    var pass = "some44Passddword";     //document.myForm.password1.value;
    var patt = new RegExp("^(?=(.*[a-zA-Z]){1,})(?=(.*[0-9]){2,}).{8}$");

    if ( !patt.test(pass) ) 
    {
        alert("Password must be 8 digits long. It must include a maximum of two numbers.");
        //return false;           
    } 
    else 
    {
        alert("Valid!");
    }

您可以在此处查看:https://jsfiddle.net/esj9go59/

更新

还可以避免像“$%#^&”这样的非单词字符你应该使用

    ^(?!(.*[^a-zA-Z0-9]){1,})(?=(.*[a-zA-Z]){1,})(?=(.*[0-9]){2,}).{8}$

正则表达式。

请注意,由于某些原因,javascript 测试功能不会将 \ W 视为非单词字符,最好使用[^a-zA-Z0-9]代替此如下面的评论中所述

答案 1 :(得分:1)

我知道每个人都来过这里并告诉你使用正则表达式(部分是因为你从那开始)。请不要。有时候正则表达式是更好的选择。这种情况很少见,但是它们过度使用,而这不是其中之一。以下代码比接受的答案中的正则表达式混乱更具可读性。

此代码还允许您单独测试每个条件并为用户提供自定义错误。

function isValidPassword(str)
{
    return str.length == 8 && 
        digitCount(str) >= 2 && 
        hasLetters(str) && 
        hasOnlyLettersAndDigits(str);
}

function isAsciiCodeLetter(asciiCode)
{
    return (65 <= asciiCode && asciiCode <= 90) ||
        (97 <= asciiCode && asciiCode <= 122);
}

function isAsciiCodeDigit(asciiCode)
{
    return 48 <= asciiCode && asciiCode <= 57;
}

function hasLetters(str)
{
    for (var i = 0, len = str.length; i < len; i++) 
    {
        if (isAsciiCodeLetter(str.charCodeAt(i)))
            return true;
    }
    return false;
}

function hasOnlyLettersAndDigits(str)
{
    for (var i = 0, len = str.length; i < len; i++) 
    {
        var asciiCode = str.charCodeAt(i);
        if (!isAsciiCodeLetter(str.charCodeAt(i)) &&
            !isAsciiCodeDigit(str.charCodeAt(i)))
        {
            return false;
        }
    }
    return true;
}

function digitCount(str)
{
    var count = 0;
    for (var i = 0, len = str.length; i < len; i++) 
    {
        if (isAsciiCodeDigit(str.charCodeAt(i)))
        {
            count++;
        }
    }
    return count;
}

不要使用正则表达式,但如果你已经开始使用正则表达式,请在[0-9].*[0-9]上匹配2位数字,[a-zA-Z]匹配字符,^[0-9a-zA-Z]{8}$仅限长度和字符/数字要求。这至少有点可读:

function isValidPassword(str)
{
    var atLeastTwoDigits = new RegExp("[0-9].*[0-9]");
    var atLeastOneCharacter = new RegExp("[a-zA-Z]");
    var onlyEightCharactersAndDigits = new RegExp("^[0-9a-zA-Z]{8}$");

    return atLeastTwoDigits.test(str) && 
        atLeastOneCharacter.test(str) &&
        onlyEightCharactersAndDigits.test(str);
}

测试用例:

alert(isValidPassword("asdfasdf")); //false
alert(isValidPassword("asdfasd4")); //false
alert(isValidPassword("7sdfasd4")); //true
alert(isValidPassword("asdfas`f")); //false
alert(isValidPassword("asd3a4df-")); //false
alert(isValidPassword("asd3a4f-")); //false
alert(isValidPassword("asd3a4df")); //true
alert(isValidPassword("12345678")); //false
alert(isValidPassword("1helloo5")); //true
alert(isValidPassword("helloos5")); //false
alert(isValidPassword("45345345")); //false
alert(isValidPassword("123`567d")); //false

答案 2 :(得分:0)

你可以使用另一个正则表达式:

&#13;
&#13;
//This will yield FALSE (as you expect)
var pw = "1jkj3kjlkj3"

alert(pw.replace(/[^0-9]/g,"").length >= 2)
&#13;
&#13;
&#13;

您可以创建一个功能或将其添加到if