如何验证密码和确认要求(1个上部,1个下部,1个特殊字符,1个数字)是否满足?

问题描述 投票:0回答:2

我正在尝试验证密码输入字段,最小长度为8个字符,并且必须包含至少1个大写,1个小写,1个数字和1个特殊字符。 [如果密码有效,则标签变为绿色。如果它无效,则标签变为红色。]

我认为我得到了最小长度部分,但我不确定我是否正在为其他要求正确实现我的Javacsript。

function green() {
  var pw = document.getElementById('password').value;
  var pattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$";
  if (pw.value == pattern) {
    document.getElementById('pw').style.color = "Green";
    document.getElementById('pw').innerHTML = "Password: &#10004";
  } else {
    document.getElementById('pw').style.color = "Black";
    document.getElementById('pw').innerHTML = "Password:";
  }
}
<label id="pw" for="password">Password:</label>
<input id="password" name="password" minlength="8" maxlength="50" class="form-control" type="password" onkeyup="green()" value="" />
javascript regex html5 validation passwords
2个回答
0
投票

您的模式没问题,但您需要始终选择元素及其属性,并在适当的变量上调用适当的方法:

var pw = document.getElementById('password').value;

将值(字符串)放入pw变量中,所以

if (pw.value == pattern) {

没有意义 - 字符串没有.value属性。

例如,要定义正则表达式对象,请使用/语法

var pattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;

不是字符串语法("分隔符),否则你只需要一个字符串。

要测试字符串是否通过正则表达式,可以在正则表达式上调用.test,并传递要测试的字符串。

您分配给style.color的字符串应该是小写的,而不是标题:

function green() {
  var pwText = document.getElementById('password').value;
  var pwElm = document.getElementById('pw');
  var pattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
  if (pattern.test(pwText)) {
    pw.style.color = "green";
    pw.innerHTML = "Password: &#10004";
  } else {
    pw.style.color = "black";
    pw.innerHTML = "Password:";
  }
}
<label id="pw" for="password">Password:</label>
<input id="password" name="password" minlength="8" maxlength="50" class="form-control" type="password" onkeyup="green()" value="" />

此外,您可能会考虑向用户说明输入的密码不足,如果元素不够好,可能会将元素着色为红色:

function green() {
  var pwText = document.getElementById('password').value;
  var pwElm = document.getElementById('pw');
  var pattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
  if (pattern.test(pwText)) {
    pw.style.color = "green";
    pw.textContent = "Password: ✔";
  } else {
    pw.style.color = "red";
    pw.textContent = "Password: ❌";
  }
}
<label id="pw" for="password">Password:</label>
<input id="password" name="password" minlength="8" maxlength="50" class="form-control" type="password" onkeyup="green()" value="" />

0
投票

我从来不擅长阅读/写正则表达式。我宁愿选择不同字符串中的不同类型的字符。这比使用正则表达式更多的代码,但可读性应该是可爱的。

function green() {
    var password = document.getElementById('password').value;

    var lowercase = 'abcdefgh.....xyz';
    var uppercase = 'ABCDEFGH.....XYZ';
    var digit = '1234567890';
    var special = '§!"#¤%&/()=?@£$€{[]}+.....,<>;:_';

    var valid = true;

    if (!containsValidCharacter(password, lowercase)) {
        valid = false;
    }

    if (!containsValidCharacter(password, uppercase)) {
        valid = false;        }

    if (!containsValidCharacter(password, special)) {
        valid = false;
    }

    if (!containsValidCharacter(password, digit)) {
        valid = false;
    }

    if (password.length < 8) {
        valid = false;
    }

    if (valid) {
        document.getElementById('pw').style.color = "Green";
        document.getElementById('pw').innerHTML = "Password: &#10004";
    } else {
        document.getElementById('pw').style.color = "Black";
        document.getElementById('pw').innerHTML = "Password:";
    }
}

function containsValidCharacter(stringToTest, validCharacters) {
    for (var i = 0; i < stringToTest.length; i++) {
        if (validCharacters.indexOf(stringToTest.charAt(i)) !== -1) {
            return true;
        }
    }
    return false;
}

我很确定有一种简洁的方法来简化这个功能。祝好运。

© www.soinside.com 2019 - 2024. All rights reserved.