JS検証身分証番号の真実性


if(!this.testIdNO(this.form.idNO)) {
    this.$toast('         ');
}
testIdNO(value) {
  var vcity = {
      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 isEmpty = function (card) {
      if (/^\s*$/.test(card) === true) {
          return true;
      }
  }
  //          ,    ,    
  let isCardNo = function (card) {
      if (isEmpty(card)) {
          return true;
      }
      //             
      //      15   18 ,15      ,18  17    ,        ,        X  
      var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
      if (reg.test(card) === false) {
          return false;
      }


      return true;
  };

  //       ,      
  let checkProvince = function (card) {
      if (isEmpty(card)) {
          return true;
      }
      var province = card.substr(0, 2);
      if (vcity[province] == undefined) {
          return false;
      }
      return true;
  };

  //          
  let checkBirthday = function (card) {
      if (isEmpty(card)) {
          return true;
      }
      var len = card.length;
      //   15  ,    (3 ) (3 ) (2 ) (2 ) (2 )   (3 ),      
      if (len == '15') {
          var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
          var arr_data = card.match(re_fifteen);
          var year = arr_data[2];
          var month = arr_data[3];
          var day = arr_data[4];
          var 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') {
          var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
          var arr_data = card.match(re_eighteen);
          var year = arr_data[2];
          var month = arr_data[3];
          var day = arr_data[4];
          var birthday = new Date(year + '/' + month + '/' + day);
          return verifyBirthday(year, month, day, birthday);
      }
      return false;
  };

  //      
  let verifyBirthday = function (year, month, day, birthday) {
      var now = new Date();
      var now_year = now.getFullYear();
      //         
      if (birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day) {
          //       (3  100   )  
          var time = now_year - year;
          if (time >= 3 && time <= 100) {
              return true;
          }
          return false;
      }
      return false;
  };

  //        
  let checkParity = function (card) {
      if (isEmpty(card)) {
          return true;
      }
      //15  18   
      card = changeFivteenToEighteen(card);
      var len = card.length;
      if (len == '18') {
          var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
          var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
          var cardTemp = 0, i, valnum;
          for (i = 0; i < 17; i++) {
              cardTemp += card.substr(i, 1) * arrInt[i];
          }
          valnum = arrCh[cardTemp % 11];
          if (valnum == card.substr(17, 1)) {
              return true;
          }
          return false;
      }
      return false;
  };

  //15  18       
  let changeFivteenToEighteen = function (card) {
      if (isEmpty(card)) {
          return true;
      }
      if (card.length == '15') {
          var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
          var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
          var cardTemp = 0, i;
          card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);
          for (i = 0; i < 17; i++) {
              cardTemp += card.substr(i, 1) * arrInt[i];
          }
          card += arrCh[cardTemp % 11];
          return card;
      }
      return card;
  };

  //checkCard = function () {
  var card = value;
  //    ,    
  if (isCardNo(card) === false) {
      //alert('            ,     ');
      //document.getElementById('card_no').focus;
      return false;
  }
  //      
  if (checkProvince(card) === false) {
      return false;
  }
  //      
  if (checkBirthday(card) === false) {
      return false;
  }
  //        
  if (checkParity(card) === false) {
      return false;
  }

  return true;
}
 
 
https://www.cnblogs.com/zpblogs/p/11239597.html#/cnblog/works/article/11239597