发布一个比较完整的身份证验证函数
VBS版:
' 检测身份证号码格式是否正确
' Version 2.2 Create by 南极之星(pure_xu@163.com)
' sStr 为字符串型的身份证号码,dDate 为出生日期,nSex 为性别——1:男、0:女
Function CheckIDCard(sStr, ByVal dDate, ByVal nSex)
CheckIDCard = "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
CheckIDCard = "True"
End Function
JS版:
function checkIDCard(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;
}