工作中需要用到身份证验证,还要支持检查15位和18位。
我一时手懒,问同事有没有现成的函数可用,同事google了一下,扔给我一个 asp-vbscript版本的函数。
可我这边是客户端javascript呀,于是用改 vbs-->js
改完发现蛮好用的,同时发现 vbscript真的很啰嗦,居然写了50多行,我改成js 只用了11行。
当然,我并完全是指vbscript啰嗦,那个写这段vbs代码的无名氏也是个唐僧性格.....
先放出 vbscript代码 ,
<
script language
=
"
vbscript
"
>
'功能:检查身份证号码
Function
CheckCardId(e)
arrVerifyCode
=
Split
(
"
1,0,x,9,8,7,6,5,4,3,2
"
,
"
,
"
)
Wi
=
Split
(
"
7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
"
,
"
,
"
)
Checker
=
Split
(
"
1,9,8,7,6,5,4,3,2,1,1
"
,
"
,
"
)
If
Len
(e)
<
15
Or
Len
(e)
=
16
Or
Len
(e)
=
17
Or
Len
(e)
>
18
Then
CheckCardId
=
"
身份证号共有 15 码或18位
"
CheckCardId
=
False
Exit
Function
End
If
Dim
Ai
If
Len
(e)
=
18
Then
Ai
=
Mid
(e,
1
,
17
)
ElseIf
Len
(e)
=
15
Then
Ai
=
e
Ai
=
Left
(Ai,
6
)
&
"
19
"
&
Mid
(Ai,
7
,
9
)
End
If
If
Not
IsNumeric
(Ai)
Then
CheckCardId
=
"
身份证除最后一位外,必须为数字!
"
Exit
Function
End
If
Dim
strYear, strMonth, strDay
strYear
=
CInt
(
Mid
(Ai,
7
,
4
))
strMonth
=
CInt
(
Mid
(Ai,
11
,
2
))
strDay
=
CInt
(
Mid
(Ai,
13
,
2
))
BirthDay
=
Trim
(strYear)
+
"
-
"
+
Trim
(strMonth)
+
"
-
"
+
Trim
(strDay)
If
IsDate
(BirthDay)
Then
If
DateDiff
(
"
yyyy
"
,
Now
,BirthDay)
<-
140
or
cdate
(BirthDay)
>
date
()
Then
CheckCardId
=
"
身份证输入错误!
"
Exit
Function
End
If
If
strMonth
>
12
Or
strDay
>
31
Then
CheckCardId
=
"
身份证输入错误!
"
Exit
Function
End
If
Else
CheckCardId
=
"
身份证输入错误!
"
Exit
Function
End
If
Dim
i, TotalmulAiWi
For
i
=
0
To
16
TotalmulAiWi
=
TotalmulAiWi
+
CInt
(
Mid
(Ai, i
+
1
,
1
))
*
Wi(i)
Next
Dim
modValue
modValue
=
TotalmulAiWi
Mod
11
Dim
strVerifyCode
strVerifyCode
=
arrVerifyCode(modValue)
Ai
=
Ai
&
strVerifyCode
CheckCardId
=
Ai
If
Len
(e)
=
18
And
e
<>
Ai
Then
CheckCardId
=
"
身份证输入错误!
"
Exit
Function
End
If
End Function
</
script
>
再放出 javascript版本代码
function
checkId(pId){
//
检查身份证号码 Go_Rush(阿舜) from http://ashun.cnblogs.com
var
arrVerifyCode
=
[
1
,
0
,
"
x
"
,
9
,
8
,
7
,
6
,
5
,
4
,
3
,
2
];
var
Wi
=
[
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
,
6
,
3
,
7
,
9
,
10
,
5
,
8
,
4
,
2
];
var
Checker
=
[
1
,
9
,
8
,
7
,
6
,
5
,
4
,
3
,
2
,
1
,
1
];
if
(pId.length
!=
15
&&
pId.length
!=
18
)
return
"
身份证号共有 15 码或18位
"
;
var
Ai
=
pId.length
==
18
?
pId.substring(
0
,
17
) : pId.slice(
0
,
6
)
+
"
19
"
+
pId.slice(
6
,
16
);
if
(
!/^
/d
+
$
/
.test(Ai))
return
"
身份证除最后一位外,必须为数字!
"
;
var
yyyy
=
Ai.slice(
6
,
10
) , mm
=
Ai.slice(
10
,
12
)
-
1
, dd
=
Ai.slice(
12
,
14
);
var
d
=
new
Date(yyyy,mm,dd) ,
now
=
new
Date();
var year=d.getFullYear() , mon=d.getMonth() , day=d.getDate();
if
(year
!=
yyyy
||
mon
!=
mm
||
day
!=
dd
||
d
>
now
||
year<1940
)
return
"
身份证输入错误!
"
;
for
(
var
i
=
0
,ret
=
0
;i
<
17
;i
++
) ret
+=
Ai.charAt(i)
*
Wi[i];
Ai
+=
arrVerifyCode[ret
%=
11
];
return
pId.length
==
18
&&
pId
!=
Ai
?
"
身份证输入错误!
"
:Ai
;
};
至于身份证算法的原理,请参阅: http://www.google.com/
最后,根据身份证号码取 省份,生日,性别就很简单了
<
script language
=
"
javascript
"
>
var
id
=
"
342201570202003
"
//
根据身份证取 省份,生日,性别 Go_Rush(阿舜) from http://ashun.cnblogs.com/
function
getInfo(id){
var
arr
=
[
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
"
北京
"
,
"
天津
"
,
"
河北
"
,
"
山西
"
,
"
内蒙古
"
,
null
,
null
,
null
,
null
,
null
,
"
辽宁
"
,
"
吉林
"
,
"
黑龙江
"
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
"
上海
"
,
"
江苏
"
,
"
浙江
"
,
"
安微
"
,
"
福建
"
,
"
江西
"
,
"
山东
"
,
null
,
null
,
null
,
"
河南
"
,
"
湖北
"
,
"
湖南
"
,
"
广东
"
,
"
广西
"
,
"
海南
"
,
null
,
null
,
null
,
"
重庆
"
,
"
四川
"
,
"
贵州
"
,
"
云南
"
,
"
西藏
"
,
null
,
null
,
null
,
null
,
null
,
null
,
"
陕西
"
,
"
甘肃
"
,
"
青海
"
,
"
宁夏
"
,
"
新疆
"
,
null
,
null
,
null
,
null
,
null
,
"
台湾
"
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
"
香港
"
,
"
澳门
"
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
null
,
"
国外
"
]
id
=
checkId(id)
if
(isNaN(id))
return
"
错误的身份证号码
"
var
id
=
String(id), prov
=
arr[id.slice(
0
,
2
)] , sex
=
id.slice(
14
,
17
)
%
2
?
"
男
"
:
"
女
"
var
birthday
=
(
new
Date(id.slice(
6
,
10
) , id.slice(
10
,
12
)
-
1
, id.slice(
12
,
14
))).toLocaleDateString()
return
[prov,birthday,sex]
}
alert(getInfo(id))
</
script
>
上面的代码只能取到省份,要取到具体城市,请看我的另外一个随笔, 点这里
代码只拿我和几个同事的身份证号码测了一下,如果有Bug请指出
转自:http://www.cnblogs.com/ashun/archive/2007/04/12/idcard-javascript-birthday.html