JS 添加有效身份证验证

/**
 * certificate 身份证识别
 */
export function IdentifyCertificate(cardNo) {
  let idCard = cardNo.toString();
  let province = {
    11: "北京",
    12: "天津",
    13: "河北",
    14: "山西",
    15: "内蒙古",
    21: "辽宁",
    22: "吉林",
    23: "黑龙江",
    31: "上海",
    32: "江苏",
    33: "浙江",
    34: "安徽",
    35: "福建",
    36: "江西",
    37: "山东",
    41: "河南",
    42: "湖北",
    43: "湖南",
    44: "广东",
    45: "广西",
    46: "海南",
    50: "重庆",
    51: "四川",
    52: "贵州",
    53: "云南",
    54: "西藏",
    61: "陕西",
    62: "甘肃",
    63: "青海",
    64: "宁夏",
    65: "新疆",
    71: "台湾",
    81: "香港",
    82: "澳门",
    91: "国外"
  };
  let result = {
    flag: true,
    msg: "身份证有效"
  };
  // 判空
  if (idCard === "") {
    result.flag = false;
    result.msg = "请输入身份证号,身份证号不能为空";
  } else if (checkNum(idCard) === false) {
    result.flag = false;
    result.msg = "身份证号码位数不正确,请重新输入";
  } else if (isCardNo(idCard) === false) {
    // 校验长度,类型
    result.flag = false;
    result.msg = "您输入的身份证号码不正确,请重新输入";
  } else if (checkProvince(province, idCard) === false) {
    //检查省份
    result.flag = false;
    result.msg = "您输入的身份证号码不正确,请重新输入";
  } else if (checkBirthday(idCard) === false) {
    //校验生日
    result.flag = false;
    result.msg = "您输入的身份证号码生日不正确,请重新输入";
  } else if (checkParity(idCard) === false) {
    //检验位的检测
    result.flag = false;
    result.msg = "您的身份证校验位不正确,请重新输入";
  }
  return result;
}

// 身份证位数校验
function checkNum(idCard) {
  let regIdCard = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
  if (!regIdCard.test(idCard)) {
    return false;
  } else {
    return true;
  }
}

//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
function isCardNo(idCard) {
  var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
  if (reg.test(idCard) === false) {
    return false;
  }
  return true;
}

//取身份证前两位,校验省份
function checkProvince(province, idCard) {
  var pro = idCard.substr(0, 2);
  if (province[pro] == undefined) {
    return false;
  }
  return true;
}

//检查生日是否正确
function checkBirthday(idCard) {
  var len = idCard.length;
  //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
  if (len == "15") {
    let re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
    let arr_data = idCard.match(re_fifteen);
    let year = arr_data[2];
    let month = arr_data[3];
    let day = arr_data[4];
    let birthday = new Date("19" + year + "/" + month + "/" + day);
    return verifyBirthday("19" + year, month, day, birthday);
  }
  //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
  if (len == "18") {
    let re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
    let arr_data = idCard.match(re_eighteen);
    let year = arr_data[2];
    let month = arr_data[3];
    let day = arr_data[4];
    let birthday = new Date(year + "/" + month + "/" + day);
    return verifyBirthday(year, month, day, birthday);
  }
  return false;
}

// 生日校验
function verifyBirthday(year, month, day, birthday) {
  let now = new Date();
  let now_year = now.getFullYear();
  //年月日是否合理
  if (
    birthday.getFullYear() == year &&
    birthday.getMonth() + 1 == month &&
    birthday.getDate() == day
  ) {
    //判断年份的范围(3岁到100岁之间)
    let time = now_year - year;
    if (time >= 3 && time <= 100) {
      return true;
    }
    return false;
  }
  return false;
}

// 校验位的检测
function checkParity(idCard) {
  //15位转18位
  idCard = changeFivteenToEighteen(idCard);
  let len = idCard.length;
  if (len == "18") {
    let arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
    let arrCh = new Array(
      "1",
      "0",
      "X",
      "9",
      "8",
      "7",
      "6",
      "5",
      "4",
      "3",
      "2"
    );
    let cardTemp = 0;
    for (let i = 0; i < 17; i++) {
      cardTemp += idCard.substr(i, 1) * arrInt[i];
    }
    let valnum = arrCh[cardTemp % 11];
    if (valnum == idCard.substr(17, 1)) {
      return true;
    }
    return false;
  }
  return false;
}

//15位转18位身份证号
function changeFivteenToEighteen(idCard) {
  if (idCard.length == "15") {
    let arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
    let arrCh = new Array(
      "1",
      "0",
      "X",
      "9",
      "8",
      "7",
      "6",
      "5",
      "4",
      "3",
      "2"
    );
    let cardTemp = 0;
    idCard = idCard.substr(0, 6) + "19" + idCard.substr(6, idCard.length - 6);
    for (let i = 0; i < 17; i++) {
      cardTemp += idCard.substr(i, 1) * arrInt[i];
    }
    idCard += arrCh[cardTemp % 11];
    return idCard;
  }
  return idCard;
}

已经封装,可以直接引用判断方法,可以根据自身需求调整

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值