老话闲说,关于身份证号码的验证

       身份证号码的验证,相信百度一下,一大摞框,在这里我就不说别的了,给你说说我用js简单验证的方法,供参考。

       我国的第一代居民身份证是1986年办理的,当时主要由乡镇一级政府组织登记办理,直到上世纪90年代初才开始由公安机关代为管理。

       第一代身份证号码由15位数组成,其中前6位数为省、市(地)、县(区)的代码。比如 412825表示河南省驻马店市上蔡县,而随后的660501表示公民的出生年月日既1966年5月1日,这一点跟18位的一个区别(18位表示出生年月日用19660501),而最后的 *** 是3个随机码,且最后一位数字代表公民的性别,男性为单数,女性为偶数。与18位身份证号的另一个区别:没有最后一位的校验码。

      18位身份证组成,17位数字+1位校验码,从左至右依次为:6位地址码,8位出生日期码,3位数字顺序码,1位数字校验码:

      1、第1位表示地区,第2、3两位组合表示省,自治区,直辖市),第3、4为表示地区(市,州, 盟),第5、6为表示县(旗,镇,区)的名称。

      2、出生日期码(第7位至第14位)表示出生的年、月、日;

      3、顺序码,表示在同一地址码所标识的区域范围内,对同年同月同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性;

      4、校验码,是由ISO 7064:1983.MOD11-2校验码计算法得出的,分别为罗马数字 0、1、2、3、4、5、6、7、8、9、x中的某一位;

      5、特殊的规定,末尾的 996, 997, 998和 999这四个号为百岁以上老人的特殊规定编号,其他任何人都不会有该编号。

 

     废话不说了,上代码:  

 

function testIdCode(nums) {   //nums表示客户端输入的身份证号码
        var birth;
        var num = $.trim(nums.replace(/\s+/g, ""));
        num = num.toUpperCase();
        if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
            alert('输入的身份证号长度不对,或者号码不符合规定!\n身份证号码为15位时,应全为数字,\n身份证号码为18位时,末位可以为数字或X。');
            return false;
        }
        var len, re;
        len = num.length;

        if (len == 15) {  //15位身份证号码验证
            re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
            var arrSplit = num.match(re);

            //检查生日日期是否正确
            var dtmBirth = new Date('19' + arrSplit[2] + '-' + arrSplit[3] + '-' + arrSplit[4]);
            var bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));

            if (!bGoodDay) {  //校验出生日期是否合理性
                alert('输入的15位身份证号里[出生日期]格式有误!');
                return false;
            } else {
                birth = '19' + arrSplit[2] + '-' + arrSplit[3] + '-' + arrSplit[4];

            }
        } else if (len == 18) {
            var year = num.substr(6, 4);
            var nowDate = new Date();
            var nowYear = nowDate.getYear();

            if ((nowYear - year) > 112) {
                //alert("依照输入的身份证出生日期截止到当前,本人已经超过112岁!");
                //return false;
            }

            re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
            var arrSplit = num.match(re);

            //检查生日日期是否正确
            var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
            var bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));

            if (!bGoodDay) {
                alert('输入的18位身份证号里[出生日期]格式有误!');
                return false;
            } else {
                var valnum;
                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 nTemp = 0, i;
                for (i = 0; i < 17; i++) {
                    nTemp += num.substr(i, 1) * arrInt[i];
                }
                valnum = arrCh[nTemp % 11];
                if (valnum != num.substr(17, 1)) {
                    alert('18位身份证的最后一位最后一位不正确!');
                    return false;
                }
                birth = arrSplit[2] + "-" + arrSplit[3] + "-" + arrSplit[4];
            }
        } else {
            alert('输入的身份证号码有误,请重新输入!');
            return false;
        }
        //验证地区是否有效
        var aCity = { 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: "国外 " }
        if (aCity[parseInt(num.substr(0, 2))] == null) {
            alert("输入的身份证号前两位不对!");
            return false;
        }
        return birth;
    }

 

另外一种方式:

假设某一17位身份证数字是
17位数字:   4     1     2     8     2     5    1     9     9     0     1     2     2     3     4    5     4
加权因子:  7     9     10    5     8     4     2     1     6     3     7     9     10    5     8     4     2
计算17位数字各位数字与对应的加权因子的乘积的和S: 4×7+1×9+2×10+8×5+2×8+5×4+1×2+9×1+9×6+0×3+1×7+2×9+2×10+3×5+4×8+5×4+4×2=368;
计算S÷11的余数T:318 %11=10;
((  余数0-10对应校验码为[1, 0, X , 9, 8, 7, 6, 5, 4, 3, 2],可直接返回,或下面算法 ))
计算(12-T)÷11的余数R,如果R=10,校验码为字母“X”;如果R≠10,校验码为数字“R”:(12-10)%11=2。
该17位数字的校验码就是2,聚合在一为412825199012234542。

 

posted @ 2017-08-28 17:42  阿两君  阅读(786)  评论(0编辑  收藏  举报