我一直在尝试制作密码验证器。它只允许密码至少包含一个字母,至少一个数字和至少一个非字母数字字符。
我的下面有效:
function passwordValidate(password, password_c, msg)
{
if (notEmpty(password, "Enter a password"))
{
if (password.value === password_c.value)
{
if(/\W/.test(password.value))
{
if (/\d/.test(password.value) && /[a-zA-Z]/.test(password.value))
{
return true;
} else {
alert(msg);
}
} else {
alert("Must have a special character in your password");
}
} else {
alert("Passwords don't match");
}
}
return false;
}
我最初有“password.value.match("\W|_")
”导致问题,因此将其更改为“/\W/.test(password.value)
”。有谁知道如何将它组合成一个正则表达式?
答案 0 :(得分:1)
你可以使用断言 断言子模式以常规方式匹配,但它不会导致当前匹配位置发生变化。
尝试:
var rgx=/(?=.*\d)(?=.*[a-zA-Z])(?=.*[^0-9a-zA-Z])/
//my test
var theTest=['azert7ui@i4','uiou5','4761238|z','jhkj','8989go','457@457'];
for (i=0;i<theTest.length;i++) alert(theTest[i]+' '+rgx.test(theTest[i]));
所以最初我们测试1位数(?=.*\d
)。它可以先于某事与否。
接下来是字母字符和非字母字符。使用\w
(“单词”字符是任何字母或数字)重复数字是错误的(仅对数字和特殊字符进行测试)。
\
是字符串中的特殊含义,因此测试错误。
希望有所帮助
答案 1 :(得分:1)
此外,不要使if
语句的这些嵌套楼梯,而是尽早爆发。它更清洁:
function passwordValidate(password, password_c, msg) {
if (!notEmpty(password, "Enter a password")) {
return false;
}
if (password.value !== password_c.value) {
alert("Passwords don't match");
return false;
}
if(!/(?=.*\d)(?=.*[a-zA-Z])(?=.*[^\da-zA-Z])/.test(password.value)) {
alert("Must have a special character in your password");
return false;
}
alert(msg);
return true;
}
答案 2 :(得分:0)
//进行单独测试可能更容易 -
function testPassword(pw){
pw= pw.replace(/\s+/, ''); //remove spaces
var msg= [' non-alphanumerical', ' alphabetical', ' digit'],
rx= [/\W/,/[a-zA-Z]/,/\d/];
for(var i= 0;i<3;i++){
if(!rx[i].test(pw)) throw Error('At least one'+
msg[i]+' character is required');
}
return pw;
}