React的严格的18位身份证格式校验

这个也没什么需求只是自己贤者无聊打发时间优化的一下代码,这个其实有个隐藏的秘密,就是当你们的测试是个小姐姐的时候,你不知道别人多大,有想知道而不敢问的时候,就可以把这个校验加的严格些,这样她乱输入是不会校验过的,必须输入正确的才会过,是不是有坏啊,不过有点头脑的小姐姐百度随便一查都能查到生成身份证号码的工具了,这就聊的后话了,如果你们的证件选择只有一个可以这样玩,但是如果有多个你自己还要去进行判断用户选择的下拉框的证件类型来判断不同的证件号这个就要自己去写和修改了,
这里还插入一个自己常用的在线省份证号码生成工具吧。

在线省份证号码生成工具

//身份证输入文本框
<FormItem label="证件号码">
	{getFieldDecorator('crdtNo', {
	    initialValue: '',
	    validateTrigger: 'onBlur',                     
	    rules: [
	      {
	        required: true,
	        validator: this.checkLength,
	      },
	    ],
	  })(<Input placeholder="必填 请输入号码" />)}
</FormItem>
//  身份证校验规则
  checkLength = (rule, value, callback) => {
    if (this.checkIDCard(value)) {
      callback();
    } else {
      callback('请输入正确的身份证号码');
    }
  }

  checkIDCard = (value) => {
    // 加权因子
    const weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    // 校验码
    const check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

    const code = value + '';
    const last = value[17];

    const seventeen = code.substring(0, 17);
    
	 // ISO 7064:1983.MOD 11-2
    // 判断最后一位校验码是否正确
    const arr = seventeen.split('');
    const len = arr.length;
    let num = 0;
    for (let i = 0; i < len; i += 1) {
      num += (arr[i] * weight_factor[i]);
    }

    // 获取余数
    const resisue = num % 11;
    const last_no = check_code[resisue];

	// 格式的正则
    // 正则思路
    /*
    第一位不可能是0
    第二位到第六位可以是0-9
    第七位到第十位是年份,所以七八位为19或者20
    十一位和十二位是月份,这两位是01-12之间的数值
    十三位和十四位是日期,是从01-31之间的数值
    十五,十六,十七都是数字0-9
    十八位可能是数字0-9,也可能是X
    */
    const idcard_patter = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/;

    // 判断格式是否正确
    const format = idcard_patter.test(value);

    // 返回验证结果,校验码和格式同时正确才算是合法的身份证号码
    return last === last_no && format;
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章