zl程序教程

您现在的位置是:首页 >  后端

当前栏目

js实现身份证号码验证的简单实例

JS实例 实现 简单 验证 号码 身份证
2023-06-13 09:15:18 时间

以下是根据身份证号码编码规则,使用JS对其进行有效性验证代码

IdCard-Validate.js代码如下:

复制代码代码如下:

/**
 *身份证15位编码规则:ddddddyymmddxxp
 *dddddd:地区码
 *yymmdd:出生年月日
 *xx:顺序类编码,无法确定
 *p:性别,奇数为男,偶数为女
 *<p/>
 *身份证18位编码规则:ddddddyyyymmddxxxy
 *dddddd:地区码
 *yyyymmdd:出生年月日
 *xxx:顺序类编码,无法确定,奇数为男,偶数为女
 *y:校验码,该位数值可通过前17位计算获得
 *<p/>
 *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);
 }elseif(idCard.length==18){
  vara_idCard=idCard.split("");//得到身份证数组
  if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){
   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;
 }
}
/**
 *通过身份证判断是男是女
 *@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;
 }
// 可对传入字符直接当作数组来处理
//if(idCard.length==15){
//alert(idCard[13]);
//if(idCard[13]%2==0){
//return"female";
//}else{
//return"male";
//}
//}elseif(idCard.length==18){
//alert(idCard[16]);
//if(idCard[16]%2==0){
//return"female";
//}else{
//return"male";
//}
//}else{
//returnnull;
//}
}
 /**
 *验证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,"");
}


对于上述代码中,关于性别的判断在实际使用中,可加入首先判断身份证是否有效。在本代码示例中并未进行该种判断,有点鸡肋的感觉,可在实际使用中根据情况进行丰满。