正则表达式校验身份证号带出出生日期,年龄,性别

admin6个月前9393体育1604

身分证号码说明

市民身分证号码,正确、正式的称谓应当是“公民身分号码”。按照【中华人民共和国国家标准GB11643-1999】中有关公民身分号码的规定,公民身分号码是特点组合码,由十七位数字本体码和一位数字校准码组成。排列次序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字次序码和一位数字校准码。

以广州市朝阳区一男性身分证号码为例,身分证号码所表示的涵义如右图所示:

身分证号码涵义解析

注:该身分证号码来始于国标【GB11643-1999】。

下边我们就从零开始完成一个完整的身分证号码校准过程。

方案1(简单)1.1分部规则

我们首先提出方案1,并分步做如下规则定义:

1.1.1地址码规则:

1.1.2年份码规则:

按照以上规则,写出年份码的正则表达式:/(18|19|20)\d{2}/。倘若不须要18开头的年份,可以除去18。

1.1.3月份码规则:

1.1.4日期码规则:

1.1.5次序码规则:

1.1.6校准码规则:

1.2方案1正则表达式

综合以上6条规则,给出完整的正则表达式及测试程序如下:

var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
//输出 true
console.log(p.test("11010519491231002X"));
//输出 false 不能以0开头
console.log(p.test("01010519491231002X"));
//输出 false 年份不能以17开头
console.log(p.test("11010517491231002X"));
//输出 false 月份不能为13
console.log(p.test("11010519491331002X"));
//输出 false 日期不能为32
console.log(p.test("11010519491232002X"));
//输出 false 不能以a结尾
console.log(p.test("11010519491232002a"));

依据身分证号提取出生日期,年纪,性别:

var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
if(p.test(11010519491231002X)){
	var year = 11010519491231002X.substring(6,10);
	var month= 11010519491231002X.substring(10,12);
	var day= 11010519491231002X.substring(12,14);
	var sex= 11010519491231002X.substring(16,17);
	//获取当前年份
	var current_time = new Date().getFullYear();
	var a = year + "-" + month + "-" + day + "-";
	//将字符串日期转为date日期
	var date = new Date(Date.parse(a.replace(/-/g,"/")));
	//格式化时间,并将值写入页面
	doucment.getElementById("#xxxxxxxx").value = date.Format("yyyy-MM-dd");
	doucment.getElementById("#xxxxxxxx").value = current_time - year;
	doucment.getElementById("#xxxxxxxx").value = (sex%2==0? "女":"男");
}else{
	doucment.getElementById("#xxxxxxxx").innerHTML='

身份证格式错误

' }

1.3方案1剖析

方案1只是做了基本的格式判断,存在三个主要的不足:

方案2(全面)

按照方案1的不足,引入方案2从而改进方案1的不足。

2.1市级地址码校准

华南:上海11,北京12,广东13,四川14,内蒙15

西南:山东21,四川22,四川23

华北:北京31,四川32,四川33,四川34,四川35,四川36,四川37

华北:山东41,四川42,四川43

华北:山东44,四川45,广东46

东北:山东51,四川52,四川53,拉萨54,上海50

东北:山东61,四川62,云南63,河南64,山西65

非常:日本71,台湾81,香港82

按照上述地址码做身分证号码的前两位校准,进一步的提升确切率。当前的地址码以2013版的行政区划代码【GB/T2260】为标准。因为区划代码的历史变迁,致使地址码后四位校准显得不太可能。以三胖的身分证号为例,本人号码是2321开头,而当前行政区划代码表中并无此代码。因而本文只做前两位市级地址码的校准。

也有说法叙述91开头是外国人取得中国身分证号码的前两位编码,但本人并未得到否认。如有持91开头身分证或认识马布里的,请帮忙确认相关信息。

按照以上剖析,给出市级地址码校准及测试程序如下:

var checkProv = function (val) {
    var pattern = /^[1-9][0-9]/;
    var provs = {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:"澳门"};
    if(pattern.test(val)) {
        if(provs[val]) {
            return true;
        }
    }
    return false;
}
//输出 true,37是山东
console.log(checkProv(37));
//输出 false,16不存在
console.log(checkProv(16));

2.2出生日期码校准

出生日期码的校准不做解释,直接给出如下函数及测试程序:

var checkDate = function (val) {
    var pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
    if(pattern.test(val)) {
        var year = val.substring(0, 4);
        var month = val.substring(4, 6);
        var date = val.substring(6, 8);
        var date2 = new Date(year+"-"+month+"-"+date);
        if(date2 && date2.getMonth() == (parseInt(month) - 1)) {
            return true;
        }
    }
    return false;
}
//输出 true
console.log(checkDate("20180212"));
//输出 false 2月没有31日
console.log(checkDate("20180231"));

2.3校准码校准

校准码的估算略复杂,先给出如下公式:

校准码公式

其中ai表示身分证本体码的第i位值,而Wi表示第i位的加权因子值。

算法过程:

var checkCode = function (val) {
    var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
    var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
    var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
    var code = val.substring(17);
    if(p.test(val)) {
        var sum = 0;
        for(var i=0;i<17;i++) {
            sum += val[i]*factor[i];
        }
        if(parity[sum % 11] == code.toUpperCase()) {
            return true;
        }
    }
    return false;
}
// 输出 true, 校验码相符
console.log(checkCode("11010519491231002X"));
// 输出 false, 校验码不符
console.log(checkCode("110105194912310021"));

2.4方案2整体代码

var checkID = function (val) {
    if(checkCode(val)) {
        var date = val.substring(6,14);
        if(checkDate(date)) {
            if(checkProv(val.substring(0,2))) {
                return true;
            }
        }
    }
    return false;
}
//输出 true
console.log(checkID("11010519491231002X"));
//输出 false,校验码不符
console.log(checkID("110105194912310021"));
//输出 false,日期码不符
console.log(checkID("110105194902310026"));
//输出 false,地区码不符
console.log(checkID("160105194912310029"));

JS获取当前年份,月份

function doHandleDate() {
var myDate = new Date();
var tYear = myDate.getFullYear();
var tMonth = myDate.getMonth();
var m = tMonth + 1;
if (m.toString().length == 1) {
m = "0" + m;
}
return tYear +'-'+ m;
}
function doHandleYear(tYear) {
var myDate = new Date();
var tYear = myDate.getFullYear();
return tYear;
}
function doHandleMonth() {
var myDate = new Date();
var tMonth = myDate.getMonth();
var m = tMonth + 1;
if (m.toString().length == 1) {
m = "0" + m;
}
return m;
}

相关文章

西甲联赛集锦在哪能看回放

西甲联赛集锦在哪能看回放

西甲联赛集锦在哪能看回放...

西甲联赛第二轮_1

西甲联赛第二轮_1

西甲联赛第二轮...

意甲联赛真钱买球大全排行,意甲角球排名信誉好不好啊

意甲联赛真钱买球大全排行,意甲角球排名信誉好不好啊

意甲联赛真钱买球大全排行目录意甲联赛真钱买球大全排行意甲角球排名信誉好不好啊求欧洲五大联赛所有球队名称意甲联赛真钱买球大全排行意甲联赛真钱买球大全排行意甲联赛是全球著名的足球联赛之一,吸引了无数球迷的...

足球报:“济南兴洲之变”背后 中国职业足球春风仍未至

足球报:“济南兴洲之变”背后 中国职业足球春风仍未至

足球报撰文,分析济南兴洲之变。2月16日凌晨,距离职业联赛开赛只有半个月之际,济南兴洲俱乐部突然宣布“退出职业联赛”。随着各方发声,此次兴洲的告别的矛盾核心逐渐趋于明朗:即济南兴洲俱乐部原管理层和新投...

温馨提示 | 最低-1℃!寒潮警报!福州春节期间……

温馨提示 | 最低-1℃!寒潮警报!福州春节期间……

  (来源:福建省体育局)   原标题:温馨提示 | 最低-1℃!寒潮警报!福州春节期间……   这几天福州的天气   让人只想 “微坡”   转折马上来了   福州气温...

西甲积分榜意甲积分榜

西甲积分榜意甲积分榜

西甲积分榜意甲积分榜...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。