身份证号码验证代码集合(js)

这是一个JavaScript函数集合,用于验证15位和18位中国身份证号码的正确性,包括校验日期和最后一位校验码。代码包含了从15位升级到18位身份证号码的转换,并提供了身份证号码的日期和性别提取功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日在写一个系统,找到些身份证验证代码,先放在这里,备忘!
//以下代码是我在论坛里面问问题的一部分,后来问题没有最终解决,我更改成另外一种方法了。
function isChinaIDCard(StrNo)
{
    StrNo 
= JHshLTrim(StrNo);
    StrNo 
= JHshRTrim(StrNo);
    StrNo 
= StrNo.toString();
//    alert(StrNo.length)
    if (StrNo.length == 18)
    
{
        
var a, b, c;
        
if (!isInteger(StrNo.substr(017)))
        
{
            document.myform.CardNo.focus();
            
return false;
        }

        a 
= parseInt(StrNo.substr(01)) * 7+parseInt(StrNo.substr(11)) * 9 +parseInt(StrNo.substr(21)) * 10;
        a 
= a + parseInt(StrNo.substr(31)) * 5+parseInt(StrNo.substr(41)) * 8+parseInt(StrNo.substr(51)) * 4;
        a 
= a + parseInt(StrNo.substr(61)) * 2+parseInt(StrNo.substr(71)) * 1+parseInt(StrNo.substr(81)) * 6;
        a 
= a + parseInt(StrNo.substr(91)) * 3+parseInt(StrNo.substr(101)) * 7+parseInt(StrNo.substr(111)) * 9;
        a 
= a + parseInt(StrNo.substr(121)) * 10+parseInt(StrNo.substr(131)) * 5+parseInt(StrNo.substr(141)) * 8;
        a 
= a + parseInt(StrNo.substr(151)) * 4+parseInt(StrNo.substr(161)) * 2;
        b 
= a % 11;

        
if (b == 2)
        
//最后一位为校验位  
        {
            c 
= StrNo.substr(171).toUpperCase(); //转为大写X  
        }

        
else
        
{
            c 
= parseInt(StrNo.substr(171));
        }


        
switch (b)
        
{
            
case 0:
                
if (c != 1)
                
{
                    alert(
"身份证好号码校验位错:最后一位应该为:1");
                            document.myform.CardNo.focus();
                    
return false;
                }

                
break;
            
case 1:
                
if (c != 0)
                
{
                    alert(
"身份证好号码校验位错:最后一位应该为:0");
                            document.myform.CardNo.focus();
                    
return false;
                }

                
break;
            
case 2:
                
if (c != "X")
                
{
                    alert(
"身份证好号码校验位错:最后一位应该为:X");
                            document.myform.CardNo.focus();
                    
return false;
                }

                
break;
            
case 3:
                
if (c != 9)
                
{
                    alert(
"身份证好号码校验位错:最后一位应该为:9");
                            document.myform.CardNo.focus();
                    
return false;
                }

                
break;
            
case 4:
                
if (c != 8)
                
{
                    alert(
"身份证好号码校验位错:最后一位应该为:8");
                            document.myform.CardNo.focus();
                    
return false;
                }

                
break;
            
case 5:
                
if (c != 7)
                
{
                    alert(
"身份证好号码校验位错:最后一位应该为:7");
                            document.myform.CardNo.focus();
                    
return false;
                }

                
break;
            
case 6:
                
if (c != 6)
                
{
                    alert(
"身份证好号码校验位错:最后一位应该为:6");
                            document.myform.CardNo.focus();
                    
return false;
                }

                
break;
            
case 7:
                
if (c != 5)
                
{
                    alert(
"身份证好号码校验位错:最后一位应该为:5");
                            document.myform.CardNo.focus();
                    
return false;
                }

                
break;
            
case 8:
                
if (c != 4)
                
{
                    alert(
"身份证好号码校验位错:最后一位应该为:4");
                            document.myform.CardNo.focus();
                    
return false;
                }

                
break;
            
case 9:
                
if (c != 3)
                
{
                    alert(
"身份证好号码校验位错:最后一位应该为:3");
                            document.myform.CardNo.focus();
                    
return false;
                }

                
break;
            
case 10:
                
if (c != 2)
                
{
                    alert(
"身份证好号码校验位错:最后一位应该为:2");
                            document.myform.CardNo.focus();
                    
return false
                }

        }

    }

    
else if(StrNo.length==15)
    
//15位身份证号  
    {
        
if (!isInteger(StrNo))
        
{
            alert(
"身份证号码错误,前15位不能含有英文字母!");
                    document.myform.CardNo.focus();
            
return false;
        }

    }

    
else
    
{
        alert(
"输入的身份证号码必须为15位或者18位!");
        document.myform.CardNo.focus();
        
return false;
        }


    
switch (StrNo.length)
    
{
        
case 15:
            
if (isValidDate("19" + StrNo.substr(62), StrNo.substr(82),StrNo.substr(102)))
            
{
                
return true;
            }

            
else
            
{
                
return false;
            }

        
case 18:
            
if (isValidDate(StrNo.substr(64), StrNo.substr(102),StrNo.substr(122)))
            
{
                
return true;
            }

            
else
            
{
                
return false;
            }

    }


}


function isValidDate(iY, iM, iD)
{
    
var a = new Date();
    
var y = a.getFullYear();
//    var m = a.getMonth();
//
    var d = a.getDate();
//
    if (y != iY || m != iM || d != iD)
//
    {
//
        alert(y);
//
        alert(m);
//
        alert(d);
    if((iY<1900||iY>y)||(iM<=0||iM>12)||(iD>31||iD<=0))
    
{
        window.alert(
'身份证号码内日期错误!');
                document.myform.CardNo.focus();
        
return false;
    }

    
return true;
}


function isInteger(str)
{
    
if (/[^d]+$/.test(str))
    
{
        
return false;
    }

    
return true;
}



function IDUpdate(StrNo)
{

    
if (!isChinaIDCard(StrNo))
    
{
        
return false;
    }

    
if (StrNo.length == 15)
    
{
        
var a, b, c; 
        StrNo 
= StrNo.substr(06+ "19" + StrNo.substr(69);
        a 
= parseInt(StrNo.substr(01)) * 7+parseInt(StrNo.substr(11)) * 9 +parseInt(StrNo.substr(21)) * 10;
        a 
= a + parseInt(StrNo.substr(31)) * 5+parseInt(StrNo.substr(41)) * 8+parseInt(StrNo.substr(51)) * 4;
        a 
= a + parseInt(StrNo.substr(61)) * 2+parseInt(StrNo.substr(71)) * 1+parseInt(StrNo.substr(81)) * 6;
        a 
= a + parseInt(StrNo.substr(91)) * 3+parseInt(StrNo.substr(101)) * 7+parseInt(StrNo.substr(111)) * 9;
        a 
= a + parseInt(StrNo.substr(121)) * 10+parseInt(StrNo.substr(131))* 5+parseInt(StrNo.substr(141)) * 8;
        a 
= a + parseInt(StrNo.substr(151)) * 4+parseInt(StrNo.substr(161))* 2;
        b 
= a % 11;

        
switch (b)
        
{
            
case 0:
                
{
                    StrNo 
= StrNo + "1";
                }

                
break;
            
case 1:
                
{
                    StrNo 
= StrNo + "0";
                }

                
break;
            
case 2:
                
{
                    StrNo 
= StrNo + "X";
                }

                
break;
            
case 3:
                
{
                    StrNo 
= StrNo + "9";
                }

                
break;
            
case 4:
                
{
                    StrNo 
= StrNo + "8";
                }

                
break;
            
case 5:
                
{
                    StrNo 
= StrNo + "7";
                }

                
break;
            
case 6:
                
{
                    StrNo 
= StrNo + "6";
                }

                
break;
            
case 7:
                
{
                    StrNo 
= StrNo + "5";
                }

                
break;
            
case 8:
                
{
                    StrNo 
= StrNo + "4";
                }

                
break;
            
case 9:
                
{
                    StrNo 
= StrNo + "3";
                }

                
break;
            
case 10:
                
{
                    StrNo 
= StrNo + "3";
                }

        }

    }

    
return StrNo;
}


网上搜集

//身份证号码校验,并从中拆分出出生年月日和性别
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))
//-->

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值