您的位置:首页 > Web前端 > JavaScript

JavaScript 验证身份证号码真伪

2005-10-19 14:25 585 查看
<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));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: