Проверка пароля символов в JavaScript - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь создать что-то, что проверяет пароль, который я ввожу в приглашении, имеет заглавную букву, одну строчную букву, один специальный символ и длину ... но иногда, когда я ввожу только заглавную букву, строчнуюрегистр букв я не получаю оповещения (вы увидите это в коде) ..

Также у меня в консоли появляется следующая ошибка: Cannot read property 'length' of null at hasUpperCase"

Я опубликую код здесь:

var parola = prompt('Introdu parola:');

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

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

var minLength = 8;
  function isLongEnough(parola){
   if(parola.length >= minLength){
    return true;
  }
 }

function hasSpecialCharacter(parola){
  var specialCharacters = "£$%^&*@~";
    for(i = 0; i < parola.length; i++){
      for(j = 0; j < specialCharacters.length; j++){
        if(parola[i] === specialCharacters[j]){
            return true;
           }
        }
      }
   }

  function isPasswordValid(parola){
    if(!hasUpperCase(parola)){
      alert('The password requires a capital letter!');
      var parola = prompt('Introdu parola:');
   }

   if(!hasLowerCase(parola)){
      alert('The password requires a lower case letter!');
      var parola = prompt('Introdu parola:');
   }

  if(!isLongEnough(parola)){
     alert('The password is not long enough!');
     var parola = prompt('Introdu parola:');
   }

   if(!hasSpecialCharacter(parola)){
     alert('The password requires a special character');
     var parola = prompt('Introdu parola:');
   }

   if((hasSpecialCharacter(parola) && hasLowerCase(parola) && hasUpperCase(parola)  && isLongEnough(parola)){

   }

 }
 isPasswordValid(parola);

Ответы [ 5 ]

0 голосов
/ 12 июня 2018

Для устранения упомянутой вами ошибки, а именно

Cannot read property 'length' of null at hasUpperCase

Вы должны убедиться, что значение, возвращаемое из prompt(), не является null какрезультат отмены ввода пользователем.

В противном случае вы можете прочитать строку из <input>, чтобы убедиться, что значение всегда является строкой.

Некоторые другие проблемы заключаются в том, что выне пользуйтесь простотой регулярных выражений для реализации некоторых ограничений, которые вы реализуете с помощью циклов for, что сделало бы ваш код намного более читабельным, поддерживаемым и более простым для усвоения.

Также какВ комментариях я предложил, что лучше разрешить isLongEnough() принимать параметр, локальную переменную или даже атрибут minlength в пароле, чтобы указать минимальную длину, а не переменную области действия, которая используется в настоящее время.

Наконец, было бы полезно воспользоваться атрибутом pattern элемента <input> для автоматизации некоторых требований, которые могут быть выражены врегулярное выражение. Примечание , я пытался включить это в приведенное ниже решение, но прогноз в pattern="(?=[a-z])(?=[A-Z])(?=[£$%^&*@~])", казалось, вел себя как-то глючно, поэтому я пропустил это конкретное предложение.

Работаэти предложения в решении могут выглядеть примерно так:

function hasUpperCase(parola) {
  return /[A-Z]/.test(parola);
}

function hasLowerCase(parola) {
  return /[a-z]/.test(parola);
}

function isLongEnough(parola, minLength) {
  return parola.length >= minLength;
}

function hasSpecialCharacter(parola) {
  return /[£$%^&*@~]/.test(parola);
}

function checkPasswordValidity() {
  var parola = this.value;
  var minLength = Number(this.getAttribute('minlength'));
  var errors = [];

  if (!isLongEnough(parola, minLength)) {
    errors.push('a minimum length of ' + minLength + ' characters');
  }

  if (!hasUpperCase(parola)) {
    errors.push('a capital letter');
  }

  if (!hasLowerCase(parola)) {
    errors.push('a lower case letter');
  }

  if (!hasSpecialCharacter(parola)) {
    errors.push('a special character');
  }

  if (errors.length > 0) {
    this.setCustomValidity('The password requires ' + errors.join(', '));
  } else {
    this.setCustomValidity('');
  }
}

document.querySelector('[name="password"]').addEventListener('input', checkPasswordValidity);
<form>
  <input name="password" type="text" placeholder="Introdu parola" minlength="8" required>
  <input type="submit" value="Submit">
</form>
0 голосов
/ 12 июня 2018

Вы можете использовать регулярное выражение

/^(?=.{1,}[a-z])(?=.{1,}[A-Z])(?=.{1,}([£$%^&*@~])).{8,20}$/

, чтобы соответствовать всем этим примерам.Вот краткое объяснение:

^                       // the start of the string
(?=.{1,}[a-z])             // use positive look ahead to see if at least one lower case letter exists
(?=.{1,}[A-Z])             // use positive look ahead to see if at least one upper case letter exists
(?=.{1,}[£$%^&*@~])  // use positive look ahead to see if at least one underscore or special character exists
.{8,20}                 // gobble up the entire string and match between 8 and 20
$                       // the end of the string

Вы бы использовали это так:

function isPasswordValid(parola)
{  
   if(!parola)
      return false;
   var reg = /^(?=.{1,}[a-z])(?=.{1,}[A-Z])(?=.{1,}([£$%^&*@~])).{8,20}$/g;
   if(parola && reg.test(parola)){
      //do stuff here
   }
}

, если вы не хотите делать все это, для вашего кода это очень простое исправление!удалите лишние ( и добавьте это к своему тесту:

function isPasswordValid(parola){
    if(!parola)
        return false;
.
.
.
.
.
.

if(parola && (hasSpecialCharacter(parola) && hasLowerCase(parola) && hasUpperCase(parola)  && isLongEnough(parola))){
      // do stuff here
   }

проверка только переменной будет оценена как ложная, если она:

  • ноль
  • undefined
  • NaN
  • пустая строка ("")
  • 0
  • false

и как true в противном случае.

Это должно исправить все ваши проблемы.

ОБНОВЛЕНИЕ Спасибо Патрику Робертсу за указание на ошибку в регулярном выражении.ниже приведен рабочий пример.

const regex = /^(?=.{1,}[a-z])(?=.{1,}[A-Z])(?=.{1,}([£$%^&*@~])).{8,20}$/g;
const str = 'aA$';
let m;

if ((m = regex.exec(str)) !== null) {
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
else{
  console.log('no match found')
}
0 голосов
/ 12 июня 2018

Помимо проблем с реализацией, сначала исправьте ошибку, проверив наличие нулевого или неопределенного первым в вашей функции isPasswordValid.Кроме того, как мудро предложил Патрик, используйте регулярные выражения для этих проверок.Я также рекомендовал бы всегда возвращать bool в ваших функциях проверки, возвращая false после каждого цикла for.

0 голосов
/ 12 июня 2018

Эта ошибка была причиной быстрой отмены.Итак, я думаю, что вы должны использовать значение в текстовом поле и проверить, что

Вот рабочий способ сделать это

  $('#form').on('submit', function() {
    event.preventDefault();
    var parola = $('#txt_name').val();
     isPasswordValid(parola);
  })


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

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

var minLength = 8;
  function isLongEnough(parola){
   if(parola.length >= minLength){
    return true;
  }
 }

function hasSpecialCharacter(parola){
  var specialCharacters = "£$%^&*@~";
    for(i = 0; i < parola.length; i++){
      for(j = 0; j < specialCharacters.length; j++){
        if(parola[i] === specialCharacters[j]){
            return true;
           }
        }
      }
   }

  function isPasswordValid(parola){
    if(!hasUpperCase(parola)){
      alert('The password requires a capital letter!');
      return;
   }

   if(!hasLowerCase(parola)){
      alert('The password requires a lower case letter!');
     return;
   }

  if(!isLongEnough(parola)){
     alert('The password is not long enough!');
    return;
   }

   if(!hasSpecialCharacter(parola)){
     alert('The password requires a special character');
     return;
   }

   if(hasSpecialCharacter(parola) && hasLowerCase(parola) && hasUpperCase(parola)  && isLongEnough(parola)){
      alert('yayyy!!');
   }

 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form">
  <input type="text" name="text" value="" id="txt_name">
  <input type="submit" value="Check password">
</form>
0 голосов
/ 12 июня 2018

isPasswordValid вызывает ваши 4 функции последовательно, чтобы проверить их правильность, но не перепроверяет значение подсказки, если какая-либо из них дает сбой.Он просто просит вас ввести что-то еще, а затем продолжает.Вы можете еще раз проверить правильность приглашения, повторно вызвав isPasswordValid в конце функции.Вызов ее в конце функции предотвращает появление дополнительных подсказок при вводе неверных и действительных входных данных.

Примечание: вызов toLowerCase() для символа возвращает этот символ, поэтому @@@@AAAA был бы действительным.Чтобы обойти это, я использовал регулярные выражения в ваших функциях.

var parola = prompt('Introdu parola:');

function hasUpperCase(parola) {
  return /[A-Z]/.test(parola)
}

function hasLowerCase(parola) {
  return /[a-z]/.test(parola);
}

var minLength = 8;
function isLongEnough(parola) {
  return parola.length >= minLength;
}

function hasSpecialCharacter(parola) {
  return /[£$%^&*@~]/.test(parola);
}

var errorMessage;
function isPasswordValid(parola) {
  if (!hasUpperCase(parola)) {
    errorMessage = 'The password requires a capital letter!';
  }
  else if (!hasLowerCase(parola)) {
    errorMessage = 'The password requires a lower case letter!';
  }
  else if (!isLongEnough(parola)) {
    errorMessage = 'The password is not long enough!';
  }
  else if (!hasSpecialCharacter(parola)) {
    errorMessage = 'The password requires a special character';
  }
  else {
    alert('Password is valid');
    return;
  }

  parola = prompt(errorMessage);
  isPasswordValid(parola);
}

isPasswordValid(parola);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...