1 <!DOCTYPE html>
2 <html xmlns="http://www.w3.org/1999/xhtml">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5 <script src="../js/jquery-1.10.2.js"></script>
6 <title></title>
7 </head>
8 <body test="green" >
9 <center><br/><br/><br/><br/><br/><br/><br/><br/>
10 <script>
11 /*
12 根据〖*国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
13 地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
14 出生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
15 顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。
16 校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
17
18 出生日期计算方法。
19 15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19或18,这样就包含了所有1800-1999年出生的人;
20 2000年后出生的肯定都是18位的了没有这个烦恼,至于1800年前出生的,那啥那时应该还没身份证号这个东东,⊙﹏⊙b汗...
21 下面是正则表达式:
22 出生日期1800-2099 (18|19|20)?d{2}(0[1-9]|1[12])(0[1-9]|[12]d|3[01])
23 身份证正则表达式 /^d{6}(18|19|20)?d{2}(0[1-9]|1[12])(0[1-9]|[12]d|3[01])d{3}(d|X)$/i
24 15位校验规则 6位地址编码+6位出生日期+3位顺序号
25 18位校验规则 6位地址编码+8位出生日期+3位顺序号+1位校验位
26
27 校验位规则 公式:∑(ai×Wi)(mod 11)……………………………………(1)
28 公式(1)中:
29 i----表示号码字符从由至左包括校验码在内的位置序号;
30 ai----表示第i位置上的号码字符值;
31 Wi----示第i位置上的加权因子,其数值依据公式Wi=2^(n-1)(mod 11)计算得出。
32 i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
33 Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
34
35 */
36
37 //全局变量
38 var birth;
39 var sex;
40 var addrs;
41
42 var year;
43 var age;
44 var address;
45 var city = { 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: "国外 " };
46
47 //身份证验证
48 function cardCheck(dom) {
49 var card = dom.val();
50 var d = new Date();
51 var reg = /(^d{15}$)|(^d{18}$)|(^d{17}(d|X|x)$)/;
52 address = city[card.substr(0, 2)];
53
54 if (dom.val() == "" || dom.val() == undefined)
55 {
56 alert("请填写身份证号");
57 return false;
58 }
59 else if (reg.test(card) === false)
60 {
61 alert("身份证号码为15位或18位,请检查!");
62 return false;
63 }
64 else if (!city[card.substr(0, 2)]) {
65 alert("地址编码错误");
66 return false;
67 }
68 //处理18位的身份证号码
69 else if (card.length == 18)
70 {
71 birth = card.substr(6, 4) + "-" + card.substr(10, 2) + "-" + card.substr(12, 2);
72 sex = sexCheck(card.substr(14, 3));
73 if (!(dateCheck(parseInt(card.substr(6, 4)), parseInt(card.substr(10, 2)), parseInt(card.substr(12, 2))))) {
74 return false;
75 }
76 year = parseInt(card.substr(6, 4));
77 //18位身份证需要验证最后一位校验位
78 if (card.length == 18)
79 {
80 card = card.split('');
81 //∑(ai×Wi)(mod 11)
82 //加权因子
83 var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
84 //校验位
85 var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
86 var sum = 0;
87 var ai = 0;
88 var wi = 0;
89 for (var i = 0; i < 17; i++)
90 {
91 ai = card[i];
92 wi = factor[i];
93 sum += ai * wi;
94 }
95 var last = parity[sum % 11];
96 if (parity[sum % 11] != card[17])
97 {
98 alert("校验位错误");
99 return false;
100 }
101 }
102 else
103 {
104 //年龄
105 age = (parseInt(d.getFullYear()) - year) + "岁";
106 alert("地区:" + address + ",出生日期:" + birth + ",性别:" + sex + ",年龄:" + age);
107 return true;
108 }
109 }//处理15位的身份号码
110 else if (card.length == 15)
111 {
112 birth = "19" + card.substr(6, 2) + "-" + card.substr(8, 2) + "-" + card.substr(10, 2);
113 sex = sexCheck(card.substr(12, 3));
114 if (!(dateCheck(parseInt(card.substr(6, 2)), parseInt(card.substr(8, 2)), parseInt(card.substr(10, 2)))))
115 {
116 return false;
117 }
118 year = parseInt(card.substr(6, 2));
119 }
120
121 //年龄
122 age = (parseInt(d.getFullYear()) - year) + "岁";
123 alert("地区:" + address + ",出生日期:" + birth + ",性别:" + sex + ",年龄:" + age);
124 return true;
125 }
126
127 //年月日验证
128 function dateCheck(year, month, day)
129 {
130 var d = new Date();
131 if (month > 12 || month <= 0)
132 {
133 alert("月应在1-12之间");
134 return false;
135 }
136 if (day > 31 || day <= 0)
137 {
138 alert("日应在1-31之间");
139 return false;
140 }
141 var nowYear = d.getFullYear();
142 if (year > nowYear)
143 {
144 alert("年不能超过今年");
145 return false;
146 }
147 return true;
148 }
149
150 //判断性别
151 function sexCheck(sex)
152 {
153 if (parseInt(sex) % 2 == 0) {
154 return "女";
155 }
156 else
157 {
158 return "男";
159 }
160 }
161 </script>
162 <form>
163 <input type="text" onblur="cardCheck($(this))" id="cid"/> </form>
164 </center>
165
166 </body>
167
168 </html>