js身份證號校驗

if (card === '') {
    console.log('請輸入身份證號,身份證號不能爲空');
    return false;
  }

  if (isCardNo(card) === false) {
    console.log('您輸入的身份證號碼不正確');
    return false;
  }

  //檢查省份  
  if (checkProvince(card, city) === false) {
    console.log('您輸入的身份證號碼不正確');
    return false;
  }

  //校驗生日  
  if (checkBirthday(card) === false) {
    console.log('您輸入的身份證號碼生日不正確');
    return false;
  }
  //檢驗位的檢測  
  if (checkParity(card) === false) {
    console.log('您的身份證校驗位不正確');
    return false;
  }
  return true;
  console.log('OK');

}

//檢查號碼是否符合規範,包括長度,類型  
function isCardNo(card) {
  //身份證號碼爲15位或者18位,15位時全爲數字,18位前17位爲數字,最後一位是校驗位,可能爲數字或字符X  
  var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
  if (reg.test(card) === false) {
    return false;
  }

  return true;
};

//取身份證前兩位,校驗省份  
function checkProvince(card, vcity) {
  var province = card.substr(0, 2);
  if (vcity[province] == undefined) {
    return false;
  }
  return true;
};

//檢查生日是否正確  
function checkBirthday(card) {
  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);
    console.log("輸出生日", birthday);
    return verifyBirthday(year, month, day, birthday);
  }
  return false;
};

//校驗日期  
function verifyBirthday(year, month, day, birthday) {
  var now = new Date();
  var now_year = now.getFullYear();
  //年月日是否合理  
  if (birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day) {
    //判斷年份的範圍(0歲到100歲之間)  
    var time = now_year - year;
    if (time >= 0 && time <= 100) {
      return true;
    }
    return false;
  }
  return false;
};

//校驗位的檢測  
function checkParity(card) {
  //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位身份證號  
function changeFivteenToEighteen(card) {
  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;
};







//身份證截取生日字段
function getBirthday(id) {
  return id.substr(6, 4) + '-' + id.substr(10, 2) + '-' + id.substr(12, 2);
};

 

發佈了162 篇原創文章 · 獲贊 20 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章