身份证号验证,获取户口地址、性别、出生日期

身份证号验证,获取户口地址、性别、出生日期

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>