身份证号js简单验证 .

来源:互联网 发布:snap ubuntu 编辑:程序博客网 时间:2024/05/15 12:18
在做项目时遇到了一个身份证号验证的问题,在网上搜到一个简单的验证身份证格式的js代码,遂转了过来,以备不时之需。


//身份证号码校验,并从中拆分出出生年月日和性别
var yyyy;
var mm;
var dd;
var birthday;
var sex;

function getYear(){
        
return yyyy;
}

function getMonth(){
        
return mm;
}

function getDate(){
        
return dd;
}

function getBirthday(){
        
return birthday;
}

function getSex(){
        
return sex;
}

function getAge(){
        
var mm=getMonth();
        
if (mm<10)
                mm
=mm.substring(1,2);
        
return Math.floor((parseInt(_getYear())*12+parseInt(_getMonth())-parseInt(getYear())*12-parseInt(mm))/12);
}

//判断是否大龄,男50,女40
function isBigAge(){
        
if (parseInt(getAge())>=40 && parseInt(getSex())==2)
            
return "1";
        
if (parseInt(getAge())>=50 && parseInt(getSex())==1)
            
return "1";
        
return "0";
}

//校验身份证号码
function CheckValue(idCard){
        
var id=idCard;
        
var id_length=id.length;

        
if (id_length==0){
            alert(
"请输入身份证号码!");
            
return false;
        }


        
if (id_length!=15 && id_length!=18){
            alert(
"身份证号长度应为15位或18位!");
            
return false;
        }


        
if (id_length==15){
            yyyy
="19"+id.substring(6,8);
            mm
=id.substring(8,10);
            dd
=id.substring(10,12);

            
if (mm>12 || mm<=0){
                alert(
"输入身份证号,月份非法!");
                
return false;
            }


            
if (dd>31 || dd<=0){
                alert(
"输入身份证号,日期非法!");
                
return false;
            }


            birthday
=yyyy+ "-" +mm+ "-" +dd;

            
if ("13579".indexOf(id.substring(14,15))!=-1){
                sex
="1";
            }
else{
                sex
="2";
            }

        }
else if (id_length==18){
            
if (id.indexOf("X"> 0 && id.indexOf("X")!=17 || id.indexOf("x")>0 && id.indexOf("x")!=17){
                alert(
"身份证中"X"输入位置不正确!");
                
return false;
            }


            yyyy
=id.substring(6,10);
            
if (yyyy>2200 || yyyy<1900){
                alert(
"输入身份证号,年度非法!");
                
return false;
            }


            mm
=id.substring(10,12);
            
if (mm>12 || mm<=0){
                alert(
"输入身份证号,月份非法!");
                
return false;
            }


            dd
=id.substring(12,14);
            
if (dd>31 || dd<=0){
                alert(
"输入身份证号,日期非法!");
                
return false;
            }


            
if (id.charAt(17)=="x" || id.charAt(17)=="X")
            
{
                
if ("x"!=GetVerifyBit(id) && "X"!=GetVerifyBit(id)){
                    alert(
"身份证校验错误,请检查最后一位!");
                    
return false;
                }


            }
else{
                
if (id.charAt(17)!=GetVerifyBit(id)){
                    alert(
"身份证校验错误,请检查最后一位!");
                    
return false;
                }

            }


            birthday
=id.substring(6,10+ "-" + id.substring(10,12+ "-" + id.substring(12,14);
            
if ("13579".indexOf(id.substring(16,17)) > -1){
                sex
="1";
            }
else{
                sex
="2";
            }

        }


        
return true;
}

//15位转18位中,计算校验位即最后一位
function GetVerifyBit(id){
        
var result;
        
var nNum=eval(id.charAt(0)*7+id.charAt(1)*9+id.charAt(2)*10+id.charAt(3)*5+id.charAt(4)*8+id.charAt(5)*4+id.charAt(6)*2+id.charAt(7)*1+id.charAt(8)*6+id.charAt(9)*3+id.charAt(10)*7+id.charAt(11)*9+id.charAt(12)*10+id.charAt(13)*5+id.charAt(14)*8+id.charAt(15)*4+id.charAt(16)*2);
        nNum
=nNum%11;
        
switch (nNum) {
           
case 0 :
              result
="1";
              
break;
           
case 1 :
              result
="0";
              
break;
           
case 2 :
              result
="X";
              
break;
           
case 3 :
              result
="9";
              
break;
           
case 4 :
              result
="8";
              
break;
           
case 5 :
              result
="7";
              
break;
           
case 6 :
              result
="6";
              
break;
           
case 7 :
              result
="5";
              
break;
           
case 8 :
              result
="4";
              
break;
           
case 9 :
              result
="3";
              
break;
           
case 10 :
              result
="2";
              
break;
        }

        
//document.write(result);
        return result;
}

//15位转18位
function Get18(idCard){
if (CheckValue(idCard)){
      
var id = idCard;
      
var id18=id;
      
if (id.length==0){
       alert(
"请输入15位身份证号!");
       
return false;
      }

      
if (id.length==15){
       
if (id.substring(6,8)>20){
        id18
=id.substring(0,6)+"19"+id.substring(6,15);
       }
else{
        id18
=id.substring(0,6)+"20"+id.substring(6,15);
       }


       id18
=id18+GetVerifyBit(id18);
      }


      
return id18;
}
else{
      
return false;
}

}


function checkIdcard(idcard){
var Errors=new Array(
"验证通过!",
"身份证号码位数不对!",
"身份证号码出生日期超出范围或含有非法字符!",
"身份证号码校验错误!",
"身份证地区非法!"
);
var area={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:"国外"}

var idcard,Y,JYM;
var S,M;
var idcard_array = new Array();
idcard_array 
= idcard.split("");
//地区检验
if(area[parseInt(idcard.substr(0,2))]==nullreturn Errors[4];
//身份号码位数及格式检验
switch(idcard.length){
case 15:
if ( (parseInt(idcard.substr(6,2))+1900% 4 == 0 || ((parseInt(idcard.substr(6,2))+1900% 100 == 0 && (parseInt(idcard.substr(6,2))+1900% 4 == 0 )){
ereg
=/^[1-9][0-9]{5}[0 -9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1 -9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
}
 else {
ereg 
=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1]) |(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$///测试出生日期的合法性
}

if(ereg.test(idcard)) return Errors[0];
else return Errors[2];
break;
case 18:
//18位身份号码检测
//
出生日期的合法性检查
//
闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
//
平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
ereg
=/^[1-9][0-9]{5}19[0-9]{2} ((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1 -2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
}
 else {
ereg 
=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1]) |(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0- 9Xx]$/;//平年出生日期的合法性正则表达式
}

if(ereg.test(idcard)){//测试出生日期的合法性
//
计算校验位
= (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
+ parseInt(idcard_array[7]) * 1
+ parseInt(idcard_array[8]) * 6
+ parseInt(idcard_array[9]) * 3 ;
= S % 11;
= "F";
JYM 
= "10X98765432";
= JYM.substr(Y,1);//判断校验位
if(M == idcard_array[17]) return Errors[0]; //检测ID的校验位
else return Errors[3];
}

else return Errors[2];
break;
default:
return Errors[1];
break;
}


}

var sss = "000000000000000000"
document.write (checkIdcard(sss))
原创粉丝点击