身份证规则验证代码(符合最新版身份证校验规则)

笔者上周开发过程中遇到了身份证校验的这个需求,项目里很多的地方都需要验证,于是就提成了一个单独的文件供我自己使用,今天也分享给大家。

一共分俩个文件
一:存放枚举值的,放到enums.js文件中(放入你们项目定义常量的文件里并导出就可以了)

enums.js文件新增此代码

export const 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:"国外"
};
二:校验表单中的身份证是否符合规则。可以单独放一个文件,也可以放到你们项目中统一验证form表单的文件中。

verifyTheLegitimacyOfIdCard.js新增如下内容:

import { vcity } from '../utils/enums';	//导入enums刚刚加的常量,请按照你自己的项目结构导入

/**
 * 验证身份证合法性
 * @param cardId  身份证号码  String类型
 * @returns  boolean true合法,false不合法
 */
export const checkTheIdCard = (cardId) => {
  // 检测身份证是否合法
  return !!((
    isCardNo(cardId) &&
    checkProvince(cardId) &&
    checkBirthday(cardId) &&
    checkParity(cardId)
  ));
};

// 检查基本输入规则
const isCardNo = (cardId) => {
  const reg = /(^\d{17}(\d|X|x)$)/;
  return reg.test(cardId);
};

// 检测前两位是否为省份
const checkProvince = (cardId) => {
  const province = cardId.substr(0, 2);
  return Boolean(vcity[province]);
};

// 检测生日是否正确
const checkBirthday = (cardId) => {
  const re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X|x)$/;
  const arr_data = cardId.match(re_eighteen);
  const year = arr_data[2];
  const month = arr_data[3];
  const day = arr_data[4];
  const birthday = new Date(`${year}/${month}/${day}`);
  return (verifyBirthday(year, month, day, birthday));
};

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

// 检测检验位是否正确
const checkParity = (cardId) => {
  const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
  let cardTemp = 0, i, valnum;
  for (i = 0; i < 17; i++) {
    cardTemp += cardId.substr(i, 1) * arrInt[i];
  }
  valnum = arrCh[cardTemp % 11];
  console.log('身份证检验位应该是: ', valnum);
  return (valnum == cardId.substr(17, 1));
}
最后一步就是使用了:

首先在你需要验证身份证规则的组件中导入checkTheIdCard方法。

而后再提交表单的时候将身份证号单独验证:

onSubmit = async (saveAndNew = false) => {
    // 判断是否有必填项未填等等,如果都填了进入以下步骤:
    // 校验身份证号是否正确
    const idNumber = {};	// {}代表你的form表单的数据,从中解构出身份证号。
    // if(!idNumber || checkTheIdCard(idNumber))  如果身份证号不是必填项请把判断条件改为这个
    if (checkTheIdCard(idNumber)) {		// 如果为true说明符合规则
      // 你提交表单的代码放入这里
    } else {	// 为false表示不符合规则,给出提示
      return message.error('您输入的身份证号码不符合规则,请重新输入');
    }
  };

这样你全局不管哪里需要验证身份证号码都可以导入此方法进行验证处理。

PS:此方法为最新身份证验证代码,未考虑一代身份证十五位的情况。如果有朋友特殊需要可以加笔者QQ或微信索要。1336791007

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值