Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ASP.NET正则表达式验证程序(密码强度)_Javascript_Asp.net_Regex_Validation - Fatal编程技术网

Javascript ASP.NET正则表达式验证程序(密码强度)

Javascript ASP.NET正则表达式验证程序(密码强度),javascript,asp.net,regex,validation,Javascript,Asp.net,Regex,Validation,我有一个具有以下表达式的验证控件: (?=(.*\\d.*){2,})(?=(.*\\w.*){2,})(?=(.*\\W.*){1,}).{8,} 这是一个至少包含2个数字,2个字母字符,1个非字母数字和8个字符的密码。不幸的是,这似乎不是跨浏览器兼容的 这种验证在Firefox中工作得很好,但在Internet Explorer中却不行 每个答案的组合结果为: 重要的一点是在长度第一个中使用(?{x,}),那么现有的基于jQuery的密码强度验证器(如: (?=(.*\W.*){0,})不

我有一个具有以下表达式的验证控件:

(?=(.*\\d.*){2,})(?=(.*\\w.*){2,})(?=(.*\\W.*){1,}).{8,}
这是一个至少包含2个数字2个字母字符1个非字母数字8个字符的密码。不幸的是,这似乎不是跨浏览器兼容的

这种验证在Firefox中工作得很好,但在Internet Explorer中却不行

每个答案的组合结果为:


重要的一点是在长度第一个

中使用(?{x,}),那么现有的基于jQuery的密码强度验证器(如:
(?=(.*\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,}$/
这将验证密码是否至少包含两个数字两个字母长度至少为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代码

Edit3:正常。现在我明白你的意思了

/^(?=.*[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中,
(?=)
似乎不是真正的零宽度

Edit4:更多阅读:

我认为这可以解决你的问题:

/^(?=.{8,}$)(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\W){1})/
new RegExp("^(?=.{8,}$)(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\\W){1})")

(?=.{8,}$)
需要放在第一位。

这将为您提供2分钟的数字、2分钟的字符和至少8个字符的长度。。。我拒绝向您展示如何不允许用户在密码中包含非字母数字字符,为什么网站想要强制执行不太安全的密码

^(?=.*\d{2})(?=.*[a-zA-Z]{2}).{8,}$

无益。然后他需要再次在服务器端验证,并维护逻辑两次。不管客户端验证可能已经完成,您都应该在服务器端验证。无法保证客户端做了您认为应该做的事情(浏览器可能禁用了javascript,客户端甚至可能不是浏览器。)。哈哈,我同意:P 0之所以存在,是因为它设置在服务器端(这是一个最小值,而不是“您可以有0个非字母数字”)非字母数字字符如何降低密码的安全性?[重读]".. 我拒绝向你展示如何不允许用户使用非字母数字字符“是的,在你发布、测试和运行之前我就看到了这一点:D
^(?=.*\d{2})(?=.*[a-zA-Z]{2}).{8,}$