我写了一个正则表达式,可能用于密码强度验证:
^(?:([A-Z])*([a-z])*(\d)*(\W)*){8,12}$
表达由四组:
- 零个或多个大写字符
- 零个或多个小写字符
- 零个或多个十进制数字
- 零个或多个非单词字符(!,£,$,%等)
我想它的工作方式是,以确定有多少组的人为了确定密码的强度被匹配。 因此,例如,如果只有1组匹配,这将是弱。 如果所有的四组相匹配,这将是强大的。
我已经测试使用表达式Rubular(一个Ruby正则表达式编辑器)。
在这里我可以看到在视觉上,有多少组是匹配的,但我想这样做在JavaScript中。 我写了一个脚本,返回匹配组的数量,但结果不一样,我可以看到Rubular。
我怎样才能在JavaScript实现这一目标? 是我的正则表达式胜任这项任务?
我认为你必须独立检查各组。 伪代码:
bool[] array = {};
array[0] = pwd.match(/[A-Z]/);
array[1] = pwd.match(/[a-z]/);
array[2] = pwd.match(/\d/);
array[3] = pwd.match(/[!_.-]/);
int sum = 0;
for (int i=0; i<array.length; i++) {
sum += array[i] ? 1 : 0;
}
switch (sum) {
case 0: print("weird..."); break;
case 1: print("weak"); break;
case 2: print("ok"); break;
case 3: print("strong"); break;
case 4: print("awesome"); break;
default: print("weird..."); break;
}
这是基于sp00m的回答我的最终解决方案:
function testPassword(pwString) {
var strength = 0;
strength += /[A-Z]+/.test(pwString) ? 1 : 0;
strength += /[a-z]+/.test(pwString) ? 1 : 0;
strength += /[0-9]+/.test(pwString) ? 1 : 0;
strength += /[\W]+/.test(pwString) ? 1 : 0;
switch(strength) {
case 3:
// its's medium!
break;
case 4:
// it's strong!
break;
default:
// it's weak!
break;
}
}
我为参考纯粹增加这一点,但是有接受sp00m的答案,因为这是他们的答案,让我这个解决方案。
您可以通过各组进行分离,并通过一个匹配它们一个,这样做:
var level = 0;
var input = '';//user input goes here
switch(true){
case /^(?:([A-Z])*){8,12}$/.test(input):
level = 1;
break;
case /^(?:([A-Z])*([a-z])*){8,12}$/.test(input):
level = 2;
break;
case /^(?:([A-Z])*([a-z])*(\d)*){8,12}$/.test(input):
level = 3;
break;
case /^(?:([A-Z])*([a-z])*(\d)*(\W)*){8,12}$/.test(input):
level = 4;
break;
}
的level
可变变为从1(最弱)至4(最强)。
看看这个: http://jsfiddle.net/43tu58jf/
function isSimpleStrongLevel(password){
var stringsOptions = ['123456', '123abc', 'abc123', '654321', '012345', 'password', '123pass', 'pass123', '123456abc'];
return stringsOptions.indexOf(password) != -1;
}
function getStrongLevel(password) {
var level = 0;
level += password.length > 6 ? 1 : 0;
level += /[!@#$%^&*?_~]{2,}/.test(password) ? 1 : 0;
level += /[a-z]{2,}/.test(password) ? 1 : 0;
level += /[A-Z]{2,}/.test(password) ? 1 : 0;
level += /[0-9]{2,}/.test(password) ? 1 : 0;
return level;
}
var password = '123456';
var isSimple = isSimpleStrongLevel(password);
var level = getStrongLevel(password);
console.log(isSimple, level);
我的例子
JS / jQuery的
$( "#password" ).change(function ()
{
strongPassword();
});
/**
* @author websky
*/
function strongPassword() {
var p = document.getElementById('password').value;
var label1 = 0;
var label2 = 0;
var label3 = 0;
var label4 = 0;
var label5 = 0;
if (p.length > 6) {//min length
label1 = 1;
}
if (/[!@#$%^&*?_~]{2,}/.test(p)) {//min 2 special characters
label2 = 1;
}
if (/[a-z]{2,}/.test(p)) {//min 2 a-z
label3 = 1;
}
if (/[A-Z]{2,}/.test(p)) {//min 2 A-Z
label4 = 1;
}
if (/[0-9]{2,}/.test(p)) {//min 2 0-9
label5 = 1;
}
var strong_password = label1 + label2 + label3 + label4 + label5;
if(strong_password > 0){
//Here your action
//
//var progressbar = strong_password * 20;
//$( "#progressbar" ).progressbar({value: progressbar}); <== I use jQuery progessbar
}
}
试试吧==>
var PasswordStrength = function () {
var p_worker = {
checkMark: function ( msg, mark ) {
let strength = "Required!!!", status = true;
switch ( mark ) {
case 1: strength = '<b style="color:rgb(200, 200, 200)"> Password strength: Weak...</b>'; break;
case 2: strength = '<b style="color:rgb(200, 200, 200)"> Password strength: Semi-weak...</b>'; break;
case 3: strength = '<b style="color:green"> Password strength: Medium...</b>'; break;
case 4: strength = '<b style="color:green"> Password strength: Strong...</b>'; break;
default: status = false; break;
}
return { status: status/*[is valid or not]*/, cur_strength: strength/**[strength msg]*/, req_msg: msg/**[required msg]*/, mark: mark/**[strength mark]*/ };
},
setting: {
n: { rgx: /[0-9]/, msg: '1 Numeric character' },
c: { rgx: /[A-Z]/, msg: '1 Alphabet character' },
s: { rgx: /[a-z]/, msg: '1 Small character' },
sp: { rgx: /[@#$\.%^&+=]/, msg: '1 Special character' },
}
};
return {
check: function ( value ) {
let msg = "", mark = 0, c = 0;
for ( let i in p_worker.setting ) {
if ( !p_worker.setting[i]['rgx'].test( value ) ) {
if ( c === 3 ) {
msg += '<d style="color:rgba(219, 177, 177, 0.96)">[*] ' + p_worker.setting[i]['msg'] + '</d>';
c++; continue;
}
msg += '<d style="color:rgba(219, 177, 177, 0.96)">[*] ' + p_worker.setting[i]['msg'] + ',</d></br>';
c++; continue;
}
if ( c === 3 ) {
msg += '<img src="/image/accept.png" /> <d style="color:green">' + p_worker.setting[i]['msg'] + '</d>';
mark++; c++; continue;
}
msg += '<img src="/image/accept.png" /> <d style="color:green">' + p_worker.setting[i]['msg'] + ',</d></br>';
mark++; c++;
}
return p_worker.checkMark( msg, mark );
}
}
}();
使用==>
PasswordStrength.check( "1234$#" );