Hola,
Hombre, el algoritmo podrá mejorarse lo que se quiera (de hecho, reconozco que yo trabajé más en la "integración" con jQuery, en lo que es el plugin, en cómo puede usarse) pero, tengo que decir que no se basa sólo en la longitud. Aquí están los dos métodos principales del plugin, para que pueda verse. Ah, ¡y se admiten sugerencias!
Código PHP:
function checkRepetition(pLen, str){
var res = '';
for(i = 0; i < str.length; i++){
var repeated = true;
for(j = 0; j < pLen && (j + i + pLen) < str.length; j++){
repeated = repeated && (str.charAt(j + i) == str.charAt(j + i + pLen));
}
if(j < pLen){
repeated = false;
}
if(repeated){
i += (pLen - 1);
repeated = false;
}else{
res += str.charAt(i);
}
}
return res;
};
function passwordStrength(password){
var score = 0;
if(password.length == 0){
return emptyPassResult;
}else if(password.length < 4 ){
return shortPassResult;
}
score += (password.length * 4);
score += (checkRepetition(1, password).length - password.length);
score += (checkRepetition(2, password).length - password.length);
score += (checkRepetition(3, password).length - password.length);
score += (checkRepetition(4, password).length - password.length);
// password has 3 numbers
if(password.match('/(.*[0-9].*[0-9].*[0-9])/')){
score += 5;
}
// password has 2 sybols
if(password.match('/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/'))
{
score += 5;
}
// password has Upper and Lower chars
if(password.match('/([a-z].*[A-Z])|([A-Z].*[a-z])/')){
score += 10;
}
// password has number and chars
if(password.match('/([a-zA-Z])/') && password.match('/([0-9])/')){
score += 15;
}
// password has number and symbol
if(password.match('/([!,@,#,$,%,^,&,*,?,_,~])/')
&& password.match('/([0-9])/')){
score += 15;
}
// password has char and symbol
if(password.match('/([!,@,#,$,%,^,&,*,?,_,~])/')
&& password.match('/([a-zA-Z])/')){
score += 15;
}
// password is just a nubers or chars
if(password.match('/^\w+$/') || password.match('/^\d+$/')){
score -= 10;
}
if(score < 0){
score = 0;
}
if(score > 100){
score = 100;
}
if(score < 34){
return badPassResult;
}
if(score < 68){
return goodPassResult;
}
return strongPassResult;
};