对react中的密码字段进行自定义验证

时间:2018-08-01 12:44:50

标签: javascript node.js reactjs validation

我正在制作一个只有两个值的自定义注册页面,电子邮件和密码,稍后我还将添加确认密码,对于我的密码字段,我有一些限制,我使用了一些正则表达式和一些定制代码来制作验证。

这是我的validateField:

validateField(fieldName, value) {
    let fieldValidationErrors = this.state.formErrors;
    let emailValid = this.state.emailValid;
    let passwordValid = this.state.passwordValid;
    //let passwordValidConfirm = this.state.passwordConfirmValid;
    switch(fieldName) {
      case 'email':
        emailValid = value.match(/^([\w.%+-]+)@([\w-]+\.)+([\w]{2,})$/i);
        fieldValidationErrors.email = emailValid ? '' : ' is invalid';
        break;
      case 'password':
        passwordValid = (value.length >= 5 &&  value.length <= 32) && (value.match(/[i,o,l]/) === null) && /^[a-z]+$/.test(value) && this.check4pairs(value) && this.check3InRow(value);
        fieldValidationErrors.password = passwordValid ? '': ' is not valid';
        break;
      default:
        break;
    }
    this.setState({formErrors: fieldValidationErrors,
                    emailValid: emailValid,
                    passwordValid: passwordValid,
                    //passwordValidConfirm: passwordValidConfirm
                  }, this.validateForm);
  }

如您所见

  

passwordValid

我已经制定了一些方法

  

check3InRow

没有按照我希望的方式工作,这可以确保您的字符串中至少有3个连续的字母,例如“ abc”,“ bce”或“ xyz”。

check3InRow(value){
    var counter3 = 0;
    var lastC = 0;
    for (var i = 0; i < value.length; i++) {
      if((lastC + 1) === value.charCodeAt(i)){
        counter3++;
        if(counter3 >= 3){
          alert(value);
          return true;
        }
      }
      else{
        counter3 = 0;
      }
      lastC = value.charCodeAt(i);
    }
    return false;
  }

这不能正常工作,因此应该接受:

  

aabcc

作为密码,但不是:

  

aabbc

2 个答案:

答案 0 :(得分:1)

您要从0开始计数,并寻找大于等于3的值,对于连续3个字符,该值永远不会为3。用代码休息一切就可以了。

@id="year"

答案 1 :(得分:0)

我们不能做那个功能的简单版本吗?喜欢

    
        <div class="row">
   <div class="col-md-12" [style.background]="color" id="newArea" (drop)="drop($event)" (dragover)="allowDrop($event)" [style.background]="color1" style=" padding: 10px; min-height: 550px;"> 
   </div>
</div>

我的意思是说复杂度为O(N),所以我们可以尝试一下

还要添加您的函数。当您是一个字符时,应该考虑使用1作为计数器。因为如果另一个匹配,它将是2个连续值。

function check3InRow2(value){
    for (var i = 0; i < value.length-2; i++) {
        const first = value.charCodeAt(i);
        const second = value.charCodeAt(i+1);
        const third = value.charCodeAt(i+2);
        if(Math.abs(second - first)  === 1 && Math.abs(third-second) === 1){
            return true;
        }
    }
    return false;
}