超精准的javascript验证身份证号的具体实现方法
编写程序前先来了解下身份证号的构成:
身份证号分为两种,旧的为15位,新的为18位。
身份证15位编码规则:ddddddyymmddxxp
其中dddddd:地区码 yymmdd:出生年月日 xx:顺序类编码,无法确定 p:性别,奇数为男,偶数为女;
身份证18位编码规则:ddddddyyyymmddxxxy
其中dddddd:地区码 yyyymmdd:出生年月日 xxx:顺序类编码,无法确定,奇数为男,偶数为女 y:校验码,该位数值可通过前17位计算获得,计算的公式见程序,一些需要用到的常数:
18位号码加权因子为(从右到左)Wi=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1] 验证位Y=[1,0,10,9,8,7,6,5,4,3,2] 校验位计算公式:Y_P=mod(∑(Ai×Wi),11)
i为身份证号码从右往左数的2...18位;Y_P为脚丫校验码所在校验码数组位置。
varWi=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1];//加权因子 varValideCode=[1,0,10,9,8,7,6,5,4,3,2];//身份证验证位值.10代表X functionIdCardValidate(idCard){ idCard=trim(idCard.replace(//g,""));//去掉字符串头尾空格 if(idCard.length==15){ returnisValidityBrithBy15IdCard(idCard);//进行15位身份证的验证 }elseif(idCard.length==18){ vara_idCard=idCard.split("");//得到身份证数组 if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){//进行18位身份证的基本验证和第18位的验证 returntrue; }else{ returnfalse; } }else{ returnfalse; } } /** *判断身份证号码为18位时最后的验证位是否正确 *@parama_idCard身份证号码数组 *@return */ functionisTrueValidateCodeBy18IdCard(a_idCard){ varsum=0;//声明加权求和变量 if(a_idCard[17].toLowerCase()=='x'){ a_idCard[17]=10;//将最后位为x的验证码替换为10方便后续操作 } for(vari=0;i<17;i++){ sum+=Wi[i]*a_idCard[i];//加权求和 } valCodePosition=sum%11;//得到验证码所位置 if(a_idCard[17]==ValideCode[valCodePosition]){ returntrue; }else{ returnfalse; } } /** *验证18位数身份证号码中的生日是否是有效生日 *@paramidCard18位书身份证字符串 *@return */ functionisValidityBrithBy18IdCard(idCard18){ varyear=idCard18.substring(6,10); varmonth=idCard18.substring(10,12); varday=idCard18.substring(12,14); vartemp_date=newDate(year,parseFloat(month)-1,parseFloat(day)); //这里用getFullYear()获取年份,避免千年虫问题 if(temp_date.getFullYear()!=parseFloat(year) ||temp_date.getMonth()!=parseFloat(month)-1 ||temp_date.getDate()!=parseFloat(day)){ returnfalse; }else{ returntrue; } } /** *验证15位数身份证号码中的生日是否是有效生日 *@paramidCard1515位书身份证字符串 *@return */ functionisValidityBrithBy15IdCard(idCard15){ varyear=idCard15.substring(6,8); varmonth=idCard15.substring(8,10); varday=idCard15.substring(10,12); vartemp_date=newDate(year,parseFloat(month)-1,parseFloat(day)); //对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法 if(temp_date.getYear()!=parseFloat(year) ||temp_date.getMonth()!=parseFloat(month)-1 ||temp_date.getDate()!=parseFloat(day)){ returnfalse; }else{ returntrue; } } //去掉字符串头尾空格 functiontrim(str){ returnstr.replace(/(^\s*)|(\s*$)/g,""); }
根据身份证号对其进行性别的判定
/** *通过身份证判断是男是女 *@paramidCard15/18位身份证号码 *@return'female'-女、'male'-男 */ functionmaleOrFemalByIdCard(idCard){ idCard=trim(idCard.replace(//g,""));//对身份证号码做处理。包括字符间有空格。 if(idCard.length==15){ if(idCard.substring(14,15)%2==0){ return'female'; }else{ return'male'; } }elseif(idCard.length==18){ if(idCard.substring(14,17)%2==0){ return'female'; }else{ return'male'; } }else{ returnnull; } }
以上就是javascript验证身份证号的具体实现方法,并且根据身份证能验证性别,是不是很神奇,欢迎大家学习借鉴。