验证身份证号码真伪

来源:互联网 发布:广州游泳培训.知乎 编辑:程序博客网 时间:2024/06/10 07:27
 验证身份证号码真伪

<script Language="JavaScript">
function isChinaIDCard(StrNo){
StrNo = StrNo.toString()
if (StrNo.length==18)
{
     var a,b,c
     if (!isInteger(StrNo.substr(0,17))) {return false}
     a=parseInt(StrNo.substr(0,1))*7+parseInt(StrNo.substr(1,1))*9+parseInt(StrNo.substr(2,1))*10;
     a=a+parseInt(StrNo.substr(3,1))*5+parseInt(StrNo.substr(4,1))*8+parseInt(StrNo.substr(5,1))*4;
     a=a+parseInt(StrNo.substr(6,1))*2+parseInt(StrNo.substr(7,1))*1+parseInt(StrNo.substr(8,1))*6;
     a=a+parseInt(StrNo.substr(9,1))*3+parseInt(StrNo.substr(10,1))*7+parseInt(StrNo.substr(11,1))*9;
     a=a+parseInt(StrNo.substr(12,1))*10+parseInt(StrNo.substr(13,1))*5+parseInt(StrNo.substr(14,1))*8;
     a=a+parseInt(StrNo.substr(15,1))*4+parseInt(StrNo.substr(16,1))*2;
     b=a%11;

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

     switch(b)
     {
     case 0: if ( c!=1 ) {alert("身份证好号码校验位错:最后一位应该为:1");return false;}break;
     case 1: if ( c!=0 ) {alert("身份证好号码校验位错:最后一位应该为:0");return false;}break;
     case 2: if ( c!="X") {alert("身份证好号码校验位错:最后一位应该为:X");return false;}break;
     case 3: if ( c!=9 ) {alert("身份证好号码校验位错:最后一位应该为:9");return false;}break;
     case 4: if ( c!=8 ) {alert("身份证好号码校验位错:最后一位应该为:8");return false;}break;
     case 5: if ( c!=7 ) {alert("身份证好号码校验位错:最后一位应该为:7");return false;}break;
     case 6: if ( c!=6 ) {alert("身份证好号码校验位错:最后一位应该为:6");return false;}break;
     case 7: if ( c!=5 ) {alert("身份证好号码校验位错:最后一位应该为:5");return false;}break;
     case 8: if ( c!=4 ) {alert("身份证好号码校验位错:最后一位应该为:4");return false;}break;
     case 9: if ( c!=3 ) {alert("身份证好号码校验位错:最后一位应该为:3");return false;}break;
     case 10: if ( c!=2 ){alert("身份证好号码校验位错:最后一位应该为:2");return false}
     }
     }
else //15位身份证号
     {
     if (!isInteger(StrNo)) {alert("身份证号码错误,前15位不能含有英文字母!");return false}
     }

switch(StrNo.length){
case 15:
        if (isValidDate("19"+StrNo.substr(6,2),StrNo.substr(8,2),StrNo.substr(10,2)))
            {return true;}
        else
            {return false;}
case 18:
        if (isValidDate(StrNo.substr(6,4),StrNo.substr(10,2),StrNo.substr(12,2)))
            {return true;}
        else
            {return false;}
}
alert("输入的身份证号码必须为15位或者18位!");
return false
}

function isValidDate(iY, iM, iD) {
    var a=new Date(iY,iM,iD);
    var y=a.getFullYear();
    var m=a.getMonth();
    var d=a.getDate();
    if (y!=iY || m!=iM || d!=iD)
    {
        window.alert ('身份证号码内日期错误!');
        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(0,6)+"19"+StrNo.substr(6,9)
     a=parseInt(StrNo.substr(0,1))*7+parseInt(StrNo.substr(1,1))*9+parseInt(StrNo.substr(2,1))*10;
     a=a+parseInt(StrNo.substr(3,1))*5+parseInt(StrNo.substr(4,1))*8+parseInt(StrNo.substr(5,1))*4;
     a=a+parseInt(StrNo.substr(6,1))*2+parseInt(StrNo.substr(7,1))*1+parseInt(StrNo.substr(8,1))*6;
     a=a+parseInt(StrNo.substr(9,1))*3+parseInt(StrNo.substr(10,1))*7+parseInt(StrNo.substr(11,1))*9;
     a=a+parseInt(StrNo.substr(12,1))*10+parseInt(StrNo.substr(13,1))*5+parseInt(StrNo.substr(14,1))*8;
     a=a+parseInt(StrNo.substr(15,1))*4+parseInt(StrNo.substr(16,1))*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;
}

</SCRIPT>
<input name="no" value="" >
<input type="submit"onclick="isChinaIDCard(no.value);">

 

另外还找了一个。

function isIdCardNo(num)
       {
  if (isNaN(num)) {alert("输入的不是数字!"); return false;}
  var len = num.length, re;
  if (len == 15)
    re = new RegExp(/^(/d{6})()?(/d{2})(/d{2})(/d{2})(/d{3})$/);
  else if (len == 18)
    re = new RegExp(/^(/d{6})()?(/d{4})(/d{2})(/d{2})(/d{3})(/d)$/);
  else {alert("输入的数字位数不对!"); return false;}
  var a = num.match(re);
  if (a != null)
  {
    if (len==15)
    {
      var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);
      var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
    }
    else
    {
      var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);
      var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
    }
    if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对!"); return false;}
  }
  return true;
      }
   另外一个
 <script>
  var aCity={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:"国外"}
   
  function cidInfo(sId){
   var iSum=0
   var info=""
   if(!/^/d{17}(/d|x)$/i.test(sId))return false;
   sId=sId.replace(/x$/i,"a");
   if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区";
   sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));
   var d=new Date(sBirthday.replace(/-/g,"/"))
   if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日";
   for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)
   if(iSum%11!=1)return "Error:非法证号";
   return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女")
  }

  document.write(cidInfo("380524198002300016"),"<br/>");
  document.write(cidInfo("340524198002300019"),"<br/>")
  document.write(cidInfo("340524197711111111"),"<br/>")
  document.write(cidInfo("34052419800101001x"),"<br/>");
  </script>

********************************************************************************************************

身份证号码验证函数(VBS)
Function NetRubeCheckIDCard(sStr, ByVal dDate, ByVal nSex)
NetRubeCheckIDCard= "False"
If IsNull(sStr) Or sStr= "" Then Exit Function
If Not IsDate(dDate) Or dDate= "" Then Exit Function
If Not IsNumeric(nSex) Or nSex= "" Then Exit Function

Dim oRE, sDate

Set oRE= New RegExp
oRE.IgnoreCase= True
oRE.Global= True

nSex= CInt(nSex Mod 2)
sDate= Year(dDate) & DblNum(Month(dDate)) & DblNum(Day(dDate))

Select Case Len(sStr)
Case 8
If DateDiff("yyyy", dDate, Date()) > 19 Then Exit Function
oRE.Pattern= "^[/d]{8}$"
If Not oRE.Test(sStr) Then Exit Function
If sStr <> sDate Then Exit Function
Case 15
oRE.Pattern= "^[/d]{15}$"
If Not oRE.Test(sStr) Then Exit Function
If Mid(sStr, 7, 6) <> Right(sDate, 6) Then Exit Function
If CInt(Mid(sStr, 14, 1)) Mod 2 <> nSex Then Exit Function
Case 18
oRE.Pattern= "^(?:[/d]{18}|[/d]{17}X)$"
If Not oRE.Test(sStr) Then Exit Function
If Mid(sStr, 7, 8) <> sDate Then Exit Function
If CInt(Mid(sStr, 17, 1)) Mod 2 <> nSex Then Exit Function

Dim nN, aW, aC, nL

nN= 0
aW= Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
aC= Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2")

For nL= 1 To 17
nN= nN + CInt(Mid(sStr, nL, 1)) * aW(nL - 1)
Next

If UCase(Right(sStr, 1)) <> aC(nN Mod 11) Then Exit Function
Case Else
Exit Function
End Select

Set oRE= Nothing

NetRubeCheckIDCard= "True"
End Function

Function DblNum(nNum)
DblNum= nNum
If DblNum <10 Then DblNum= "0" & DblNum
End Function

 


身份证号码验证函数(JS)

function NetRubeCheckIDCard(s, d, g)
{
if (!s) return false;
d= new Date(d);
if (!d.getTime()) return false;

var t, r;

t= "" + d.getFullYear() + dblNum(d.getMonth() + 1) + dblNum(d.getDate());

if (g == null || isNaN(g)) return false;
g= parseInt(g) % 2;

switch (s.length)
{
case 8 :
if (new Date() > d.setFullYear(d.getFullYear() + 19)) return false;
r= /^[/d]{8}$/;
if (!r.test(s)) return false;
if (s != t) return false;

break;
case 15 :
r= /^[/d]{15}$/;
if (!r.test(s)) return false;
if (s.substr(6, 6) != t.substr(2)) return false;
if (parseInt(s.charAt(14)) % 2 != g) return false;

break;
case 18 :
r= /^(?:[/d]{18}|[/d]{17}X)$/i;
if (!r.test(s)) return false;
if (s.substr(6, 8) != t) return false;
if (parseInt(s.charAt(16)) % 2 != g) return false;

var n= 0;
var w= new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);// 加权因子
var c= new Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2");// 校验码

for (var i = 0; i < 17; i++)
{
n += parseInt(s.charAt(i)) * w[i];
}

if (s.charAt(17).toUpperCase() != c[n % 11]) return false;

break;
default :
return false;
}

return true;
}

function dblNum(n)
{
return parseInt(n) < 10 ? "0" + n : n;
}

//var sss = "422324860305482";
//Response.Write(NetRubeCheckIDCard(sss, "03/05/1986", 0));

 wan
原创粉丝点击