【转自】http://www.cnblogs.com/kss/archive/2005/12/26/304493.html
1
<SCRIPT Language="JavaScript">
2
function checkIDCard (str)
3
{
4
var isIDCard1 = new Object();
5
var isIDCard2 = new Object();
6
7
//身份证正则表达式(15位)
8
isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
9
10
//身份证正则表达式(18位)
11
12
isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[A-Z])$/;
13
14
//验证身份证,如果正确,提交到reg.asp页面
15
if (isIDCard1.test(str)||isIDCard2.test(str))
16
{
17
document.forms["form1"].action = "./reg.asp";
18
document.forms[0].submit();
19
return true;
20
}
21
alert("请重新输入正确的身份证码!");
22
return false;
23
24
}
25
</SCRIPT>
26
<Form name="form1" method=post onSubmit="return checkIDCard(this.User_iden.value)">
27
<input name="User_iden" id="User_iden" size="18">
28
<input type="submit" name="testcall" value="验证身份证号码">
29
</Form>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

【转自】http://www.cnblogs.com/xuanye/archive/2007/03/23/685707.html
1
//身份证号码校验函数
2
function checkIdcard2(idcard){
3
var Errors=new Array(
4
"验证通过!",
5
"身份证号码位数不对!",
6
"身份证号码出生日期超出范围或含有非法字符!",
7
"身份证号码校验错误!",
8
"身份证地区非法!"
9
);
10
var area={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:"国外"}
11
12
var idcard,Y,JYM;
13
var S,M;
14
var idcard_array = new Array();
15
idcard_array = idcard.split("");
16
//地区检验
17
if(area[parseInt(idcard.substr(0,2))]==null)
18
{
19
alert(Errors[4]);
20
return false ;
21
}
22
//身份号码位数及格式检验
23
switch(idcard.length){
24
case 15:
25
if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
26
ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
27
} else {
28
ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
29
}
30
if(ereg.test(idcard)) return true;
31
else
32
{
33
alert(Errors[2]);
34
return false;
35
}
36
break;
37
case 18:
38
//18位身份号码检测
39
//出生日期的合法性检查
40
//闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
41
//平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
42
if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
43
ereg=/^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
44
} else {
45
ereg=/^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
46
}
47
if(ereg.test(idcard)){//测试出生日期的合法性
48
//计算校验位
49
S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
50
+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
51
+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
52
+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
53
+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
54
+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
55
+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
56
+ parseInt(idcard_array[7]) * 1
57
+ parseInt(idcard_array[8]) * 6
58
+ parseInt(idcard_array[9]) * 3 ;
59
Y = S % 11;
60
M = "F";
61
JYM = "10X98765432";
62
M = JYM.substr(Y,1);//判断校验位
63
if(M == idcard_array[17]) return true; //检测ID的校验位
64
else
65
{ alert(Errors[3]);
66
return false;
67
}
68
}
69
else
70
{
71
alert(Errors[2]);
72
return false;
73
}
74
break;
75
default:
76
alert(Errors[1]);
77
return false ;
78
break;
79
}
80
}
81

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81
