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";
}
}
答案 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以查看符号的工作原理。