Estoy tratando de validar una contraseña determinada comprobando mayúsculas, minúsculas y caracteres especiales. Se supone que el programa almacena verdadero para cada requisito encontrado y falso para cada uno que no encuentra. Si alguno de los requisitos no se encuentra, el programa imprime un mensaje de error, así como los resultados de búsqueda para cada requisito. El problema es que la variable de carácter especial sigue regresando como falsa incluso cuando hay un carácter especial en la contraseña. Parece que la función especial que pide que se verifique el carácter especial nunca se llama, pero no sé por qué. ¿Alguien puede ayudar?
// Assume password input is "Patick_" const passwordForSignup = document.getElementById("input-password"); const arrayOfSp = ["!", "@", "#", "$", "%", "&", "*", "_", "-", "?"]; const special = (c) => { console.log(c); for (let i = 0; i < arrayOfSp.length; i++) { if (c === arrayOfSp[i]) { return true; } } return false; } if (passwordForSignup.value.length >= 6 && passwordForSignup.value.length <= 17) { let upperCaseCheck = false; let lowerCaseCheck = false; let specialCharacterCheck = false; let passwordValue = ""; for (let i = 0; i < passwordForSignup.value.length; i++) { passwordValue = passwordForSignup.value[i]; if (passwordForSignup.value[i] === passwordValue.toUpperCase()) { upperCaseCheck = true; } else if (passwordForSignup.value[i] === passwordValue.toLowerCase()) { lowerCaseCheck = true; } else if (special(passwordValue)) { specialCharacterCheck = true; } } if (!upperCaseCheck || !lowerCaseCheck || !specialCharacterCheck) { console.log("Something is wrong"); console.log(upperCaseCheck); console.log(lowerCaseCheck); console.log(specialCharacterCheck); } } // else // { // message.push("Password must contain 6 - 17 characters"); // errorFound(message, e); // }La razon es que su cheque especial se hace para el ultimo y
"_".toUpperCase() por ejemplo devolver "_"
Probar:
if (special(passwordValue)) { specialCharacterCheck = true; } else if (passwordForSignup.value[i] === passwordValue.toUpperCase()) { upperCaseCheck = true; } else if (passwordForSignup.value[i] === passwordValue.toLowerCase()) { lowerCaseCheck = true; }Sin embargo, esta no es la manera de hacerlo. En su lugar, utilice expresiones regulares.
Pruebe los patrones de expresiones regulares, como este ejemplo.
const regex = /^(?=.*[az])(?=.*[AZ])(?=.*\d)(?=.*[-+_!@#$%^&*., ?]).+$/; function check_pass(){ var pass=document.getElementsByName("pass")[0].value; console.log(regex.test(pass)); } <input type='text' name='pass'><button id='test' onclick='check_pass()'>Check</button>dónde:
^ representa el comienzo de la cadena.
(?=.*[az]) representan al menos un carácter en minúscula.
(?=.*[AZ]) representa al menos un carácter en mayúscula.
(?=.*\d) representa al menos un valor numérico.
(?=.*[-+_!@#$%^&*., ?]) representa al menos uno de los caracteres especiales.
Y si desea cheques separados, puede hacerlo así:
const lower = /^(?=.*[az])/; const upper = /^(?=.*[AZ])/; const nums = /^(?=.*\d)/; const special = /^(?=.*[-+_!@#$%^&*., ?]).+$/; function check_pass() { var pass = document.getElementsByName("pass")[0].value; console.log('Lower: ' + lower.test(pass)); console.log('Upper: ' + upper.test(pass)); console.log('Numbers: ' + nums.test(pass)); console.log('Specials: ' + special.test(pass)); } <input type='text' name='pass'><button id='test' onclick='check_pass()'>Check</button>