Я пишу валидатор паролей в JS (очень простой, это всего лишь упражнение), и когда я пытаюсь проверить его в верхнем или нижнем регистре, я получаю ответ «Действительный пароль», даже если нет ни того, ни другого, до тех пор, пока в нем есть специальный символ. Я знаю, почему это происходит, но я пытаюсь понять, как исключить специальные символы при проверке строчных и прописных букв. Вот код:

function ValidatePassword(input){
  if(hasUppercase(input) && hasLowercase(input) && isLongEnough(input) && hasSpecialCharacters(input)){
    console.log('The password is valid.');
  }else if(!hasUppercase(input)){
    console.log('The password needs at least one capital letter.');
  }else if(!hasLowercase(input)){
    console.log('The password needs at least one lowercase letter.');
  }else if(!isLongEnough(input)){
    console.log('The password needs to be at least 8 characters long.');
  }else if(!hasSpecialCharacters(input)){
    console.log('The password needs at least one special character.');
  }
}

function hasUppercase(input){
  for(var i = 0; i < input.length; i++){
    if(input[i] === input[i].toUpperCase()){
      return true;
    }
  }
}

function hasLowercase(input){
  for (var i = 0; i < input.length; i++){
    if(input[i] === input[i].toLowerCase()){
      return true;
    }
  }
}

function isLongEnough(input){
  if(input.length >= 8){
    return true;
  }
}

function hasSpecialCharacters(input){
  var specialCharacters = ["/", "*", "-", "+", "_", "@", "%", "&", "<", ">", "!", "(", ")", "$", "^", "\\", "#", ".", ",", ";", ":"];
  for(var i = 0; i < input.length; i++){
    for(var j = 0; j < specialCharacters.length; j++){
      if(input[i] === specialCharacters[j]){
        return true;
      }
    }
  }
}

В любом случае, я буду признателен за любую помощь

0
Martín Scola 29 Авг 2017 в 00:49

3 ответа

Лучший ответ

Как уже упоминалось @SergioEscudero выше, использование регулярных выражений облегчает задачу. Вот рабочая версия вашего кода

function ValidatePassword(input){
    if(isLongEnough(input) && hasUppercase(input) && hasLowercase(input) && hasSpecialCharacters(input)){
        console.log('The password is valid.');
    }else if(!hasUppercase(input)){
        console.log('The password needs at least one capital letter.');
    }else if(!hasLowercase(input)){
        console.log('The password needs at least one lowercase letter.');
    }else if(!isLongEnough(input)){
        console.log('The password needs to be at least 8 characters long.');
    }else if(!hasSpecialCharacters(input)){
        console.log('The password needs at least one special character.');
    }
}

function hasUppercase(input){
    for(var i = 0; i < input.length; i++){
        if(input[i].match(/^[A-Z]*$/)){
            return true;
        }
    }
}

function hasLowercase(input){
    for (var i = 0; i < input.length; i++){
        if(input[i].match(/^[a-z]*$/)){
            return true;
        }
    }
}

function isLongEnough(input){
    if(input.length >= 8){
        return true;
    }
}

function hasSpecialCharacters(input){
for(var i = 0; i < input.length; i++){
    if(input`enter code here`[i].match(/[0-9-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/i)){
        return true;
     }

  }
}
ValidatePassword('sdgdgdgdgdgdD{')
ValidatePassword('sdgdgdgdgdgdD')
ValidatePassword('DDDDDDDDDDDDDDDD#{')
ValidatePassword('sdgdgdgdgdgd{')
//The password is valid.
//The password needs at least one special character.
//The password needs at least one lowercase letter.
///The password needs at least one capital letter.
0
Zemuldo 28 Авг 2017 в 22:41

Пароль действителен, потому что hasUppercase и hasLowercase возвращают true, например: "@". ToUpperCase () === "@". Вы можете переместить "SpecialCharacters" и изменить функции

var specialCharacters = ["/", "*", "-", "+", "_", "@", "%", "&", "<", ">", "!", "(", ")", "$", "^", "\\", "#", ".", ",", ";", ":"];

function hasUppercase(input) {
    for (var i = 0; i < input.length; i++) {
        if (specialCharacters.indexOf(input[i]) == -1 && input[i] === input[i].toUpperCase()) {
            return true;
        }
    }
}

function hasLowercase(input) {
    for (var i = 0; i < input.length; i++) {
        if (specialCharacters.indexOf(input[i]) == -1 && input[i] === input[i].toLowerCase()) {
            return true;
        }
    }
}
1
Mario Lopes 28 Авг 2017 в 22:12

Измените функции upperCase и lowerCase, как указано ниже

function hasLowercase(str) {
    return (/[a-z]/.test(str));
}

function hasUppercase(str) {
    return (/[A-Z]/.test(str));
}
1
samnu pel 28 Авг 2017 в 22:02