我有一个验证控件,其中包含以下表达式:
(?=(.*\\d.*){2,})(?=(.*\\w.*){2,})(?=(.*\\W.*){1,}).{8,}
这是一个至少 2位数, 2个字母字符, 1个非字母数字和 8个字符的密码。不幸的是,这似乎不符合跨浏览器。
此验证在Firefox中完美运行,但在Internet Explorer中不起作用。
您的每个答案的组合都会产生:
var format = "^(?=.{" + minLength + ",})" +
(minAlpha > 0 ? "(?=(.*[A-Za-z].*){" + minAlpha + ",})" : "") +
(minNum > 0 ? "(?=(.*[0-9].*){" + minNum + ",})" : "") +
(minNonAlpha > 0 ? "(?=(.*\\W.*){" + minNonAlpha + ",})" : "") + ".*$";
EX: "^(?=.{x,})(?=(.*[A-Za-z].*){y,})(?=(.*[0-9].*){z,})(?=(.*\W.*){a,}).*$"
重要的部分是(?。{x,})长度为第一。
答案 0 :(得分:14)
(?=(.*\W.*){0,})
不是0个非字母数字字符。它是至少0个非字母数字字符。如果您希望密码不包含任何非字母数字字符,则可以(?!.*\W)
或(?=\w*$)
。
更简单的解决方案是跳过\W
预测,并使用\w{8,}
代替.{8,}
。
此外,\w
包含\d
。如果您只想要alpha,则可以执行[^\W\d]
或[A-Za-z]
。
/^(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})\w{8,}$/
这会验证密码是否包含至少两位数,两个alpha ,至少8个字符,并包含只有字母数字字符(包括下划线)。
\w
= [A-Za-z0-9_]
\d
= [0-9]
\s
= [ \t\n\r\f\v]
修改强> 要在所有浏览器中使用它,您可能需要执行以下操作:
var re = new RegExp("^(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})\\w{8,}$");
if (re.test(password)) { /* ok */ }
Edit2:问题中的最新更新几乎使我的答案无效。 ^^;;
如果你用最初的模式替换模式,你最后仍然可以使用JavaScript代码。
编辑3:确定。现在我明白了你的意思。
/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{3,}/.test("password123") // matches
/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{4,}/.test("password123") // does not match
/^(?=.*[a-z].*[a-z]).{4,}/.test("password123") // matches
在Internet Explorer中,(?= )
似乎不是零宽度。
http://development.thatoneplace.net/2008/05/bug-discovered-in-internet-explorer-7.html
编辑4:更多阅读:http://blog.stevenlevithan.com/archives/regex-lookahead-bug
我认为这可以解决您的问题:
/^(?=.{8,}$)(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\W){1})/
new RegExp("^(?=.{8,}$)(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\\W){1})")
(?=.{8,}$)
需要先来。
答案 1 :(得分:1)
这将为您提供2分钟数字,2分钟字符和最少8个字符长度......我拒绝向您展示如何不允许用户在其密码中包含非字母数字字符,为什么网站要强制执行更少安全密码?
^(?=.*\d{2})(?=.*[a-zA-Z]{2}).{8,}$
答案 2 :(得分:-3)
现有的基于jQuery的密码强度验证器之一怎么样 - 比如: http://scripts.simplythebest.net/4/Ajax-Password-Strength-Meter-software.html