JavaScript实现身份证验证代码
18位身份证号码各位的含义
1-2位省、自治区、直辖市代码;
3-4位地级市、盟、自治州代码;
5-6位县、县级市、区代码;
7-14位出生年月日,比如19670401代表1967年4月1日;
15-17位为顺序号,其中17位男为单数,女为双数;
18位为校验码,0-9和X,由公式随机产生;
举例:
340523198001010013这个身份证号的含义:
34为安徽省
05为马鞍山市
23为和县
19800101为出生日期(1980年1月1日)
001为顺序号(1为单数,代表为男性)
3为验证码
行政区划代码
最新县及县以上行政区划代码(截止2014年10月31日)
北京市(110000BJ)
天津市(120000TJ)
河北省(130000HE)
山西省(140000SX)
内蒙古自治区(150000NM)
辽宁省(210000LN)
吉林省(220000JL)
黑龙江省(230000HL)
上海市(310000SH)
江苏省(320000JS)
浙江省(330000ZJ)
安徽省(340000AH)
福建省(350000FJ)
江西省(360000JX)
山东省(370000SD)
河南省(410000HA)
湖北省(420000HB)
湖南省(430000HN)
广东省(440000GD)
广西壮族自治区(450000GX)
海南省(460000HI)
重庆市(500000CQ)
四川省(510000SC)
贵州省(520000GZ)
云南省(530000YN)
西藏自治区(540000XZ)
陕西省(610000SN)
甘肃省(620000GS)
青海省(630000QH)
宁夏回族自治区(640000NX)
新疆维吾尔自治区(650000XJ)
台湾省(710000Tw)
香港特别行政区(810000HK)
澳门特别行政区(820000Mo)
身份证第18位(校验码)的计算方法
将身份证号码前面的17位数分别乘以不同的系数;
从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2
将这17位数字和系数相乘的结果相加;
用加出来和除以11,看余数是多少;
余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字;
其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2
通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
举例:
某男性的身份证号码是340523198001010013。我们要看看这个身份证是不是合法的身份证。
首先我们得出前17位的乘积和:
(3*7+4*9+0*10+5*5+2*8+3*4+1*2+9*1+8*6+0*3+0*7+1*9+0*10+1*5+0*8+0*4+1*2)=185
然后再求余:
185%11=9
最后通过对应规则就可以知道余数9对应的数字是3。所以,可以判定这是一个合格的身份证号码。
JavaScript校验18位身份证
varcity={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:"国外"}; varID='340523198001010013';
首先校验位数是否是18位:
if(!/^\d{17}(\d|x)$/i.test(ID))returnfalse; //\d匹配数字 //^匹配开始 //$匹配结尾 //i不区分大小写 //{17}匹配17次 //\d|x匹配数字或x
然后校验开头两位是否是合法的省(直辖市/自治区):
if(city[ID.substr(0,2)]===undefined)return"非法地区";
//stringObject.substr(start,length)方法可在字符串中抽取从start下标开始的指定数目的字符
//访问对象属性时除了可以用点(.)语法外,也可以用中括号([]),用中括号时更灵活
然后再校验出生日期是否合法:
varbirthday=ID.substr(6,4)+'/'+Number(ID.substr(10,2))+'/'+Number(ID.substr(12,2)); vard=newDate(birthday); varnewBirthday=d.getFullYear()+'/'+Number(d.getMonth()+1)+'/'+Number(d.getDate()); varcurrentTime=newDate().getTime(); vartime=d.getTime(); if(time>=currentTime||birthday!==newBirthday)return'非法生日'; //获取身份证的年月日,然后再new一个Date,再对比这两个日期是否一致 //这里用Number()主要是因为身份证的日期是带0的,而newDate()出来的日期是不带0的,Number()之后就都不带0了
最后判断校验码是否正确:
vararrInt=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]; vararrCh=['1','0','X','9','8','7','6','5','4','3','2']; varsum=0,i,residue; for(i=0;i<17;i++){ sum+=ID.substr(i,1)*arrInt[i]; } residue=arrCh[sum%11]; if(residue!==ID.substr(17,1))'非法证号';
如果以上校验都通过了,则是一个合法的身份证号;
完整代码
<script> functioncheckID(ID){ if(typeofID!=='string')return'非法字符串'; varcity={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:"国外"}; varbirthday=ID.substr(6,4)+'/'+Number(ID.substr(10,2))+'/'+Number(ID.substr(12,2)); vard=newDate(birthday); varnewBirthday=d.getFullYear()+'/'+Number(d.getMonth()+1)+'/'+Number(d.getDate()); varcurrentTime=newDate().getTime(); vartime=d.getTime(); vararrInt=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]; vararrCh=['1','0','X','9','8','7','6','5','4','3','2']; varsum=0,i,residue; if(!/^\d{17}(\d|x)$/i.test(ID))return'非法身份证'; if(city[ID.substr(0,2)]===undefined)return"非法地区"; if(time>=currentTime||birthday!==newBirthday)return'非法生日'; for(i=0;i<17;i++){ sum+=ID.substr(i,1)*arrInt[i]; } residue=arrCh[sum%11]; if(residue!==ID.substr(17,1))return'非法身份证哦'; returncity[ID.substr(0,2)]+","+birthday+","+(ID.substr(16,1)%2?"男":"女") } </script>