发布一个比较完整的身份证验证函数

purexu 2004-09-03 07:26:49
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;
}
...全文
304 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kxtk 2004-12-07
  • 打赏
  • 举报
回复
mark
batistuta97 2004-11-29
  • 打赏
  • 举报
回复
收藏
cuixiping 2004-11-08
  • 打赏
  • 举报
回复
收藏
顺子 2004-09-04
  • 打赏
  • 举报
回复
好東西﹐收藏
purexu 2004-09-04
  • 打赏
  • 举报
回复
最后位是检验码(包括X),上面的函数能够检验18位、15位、8位(未成年还没身份证的),该函数同时对出生年月日和性别进行检验,对于未成年还没身份证的输入8位出生年月日,如:20001001,输入8位的必须是19岁以下的

函数入口:
VBS:
sStr 为要检验的身份证号码。
dDate 为出生年月日,要正确的日期格式
nSex 为性别,奇数为男,偶数为女

JS:
s, d, g 跟上面相同
feifeizaizhe 2004-09-04
  • 打赏
  • 举报
回复
不过有好多15位变成18位后的身份证号码最后一位是X
mrshelly 2004-09-04
  • 打赏
  • 举报
回复
支持!!~~~~~~~~~~~~~~~~~~
蓝诺 2004-09-04
  • 打赏
  • 举报
回复
谢谢。。。。
purexu 2004-09-03
  • 打赏
  • 举报
回复
补上两个函数

VBS:
' 为单位数字加前导零
Function DblNum(nNum)
DblNum = nNum
If DblNum <10 Then DblNum = "0" & DblNum
End Function

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

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧