前端校验:中国大陆18位身份证校验规则及处理函数

1,839 阅读2分钟

参照文章

二代身份证号码:

1-6位:表示行政区划的代码。
1、2位,所在省(直辖市,自治区)代码;
3、4位,所在地级市(自治州)代码;
5、6位,所在区(县,自治县,县级市)的代码;
7-14位:表示出生年、月、日
15-16位:所在地派出所代码
17位:性别。奇数(1、3、5、7、9)男性,偶数(2、4、6、8、0)女性
18位:校验位,存在十一个值:0,1,2,3,4,5,6,7,8,9,X,其值是用固定公式根据前面十七位计算出来的。

代码示例:

	/**
	 * @description:大陆18位身份证校验规则;以下为elementUI表单校验函数示例;
	 * @params:[idcode]:身份证号码
	 * @params:[callback]:回调函数;
	 *
	*/
			
var validateID = (rule, idcode, callback) => {
		    // 加权因子
		    var weight_factor = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
		    // 校验码
		    var check_code = ['1', '0', 'X' , '9', '8', '7', '6', '5', '4', '3', '2'];
		
		    var code = idcode + "";
		    var last = idcode[17];//最后一位
		
		    var seventeen = code.substring(0,17);
		
		    // ISO 7064:1983.MOD 11-2
		    // 判断最后一位校验码是否正确
		    var arr = seventeen.split("");
		    var len = arr.length;
		    var num = 0;
		    for(var i = 0; i < len; i++){
		        num = num + arr[i] * weight_factor[i];
		    }
		    
		    // 获取余数
		    var resisue = num%11;
		    var last_no = check_code[resisue];
		
		    // 格式的正则
		    // 正则思路
		    /*
		    第一位不可能是0
		    第二位到第六位可以是0-9
		    第七位到第十位是年份,所以七八位为19或者20
		    十一位和十二位是月份,这两位是01-12之间的数值
		    十三位和十四位是日期,是从01-31之间的数值
		    十五,十六,十七都是数字0-9
		    十八位可能是数字0-9,也可能是X
		    */
		    var 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])$/;
		
		    // 判断格式是否正确
		    var format = idcard_patter.test(idcode);
		
		    // 返回验证结果,校验码和格式同时正确才算是合法的身份证号码
		   // return last === last_no && format ? true : false;
			if(last === last_no && format){
				
				callback();
			}else{
				
				callback(new Error('请输入正确的身份证号码'));
			}
		}