身份证号码有效性验证
function isIDCard(idcard) { ???idcard = idcard.toUpperCase(); // 对身份证号码做处理 ???var ereg; ????var Y, JYM; ???var S, M; ???/*基本校验*/ ???//if (String.isNullOrEmpty(idcard)) return false; ???var idcard_array = new Array(); ???idcard_array = idcard.split(""); ?????/*身份号码位数及格式检验*/ ???switch (idcard.length) { ???????case 15: ???????????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)) { ???????????????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}$/; //测试出生日期的合法性 ???????????} else { ???????????????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}$/; //测试出生日期的合法性 ???????????} ???????????if (ereg.test(idcard)) { ???????????????return true; ???????????} else { ???????????????return false; ???????????} ???????????break; ???????case 18: ???????????//18位身份号码检测 ???????????//出生日期的合法性检查 ???????????//闰年月日:((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])) ???????????//平年月日:((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])) ???????????if (parseInt(idcard.substr(6, 4)) % 4 == 0 || (parseInt(idcard.substr(6, 4)) % 100 == 0 && parseInt(idcard.substr(6, 4)) % 4 == 0)) { ???????????????ereg = /^[1-9][0-9]{5}19[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-9XxAa]$/; //闰年出生日期的合法性正则表达式 ???????????} else { ???????????????ereg = /^[1-9][0-9]{5}19[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-9XxAa]$/; //平年出生日期的合法性正则表达式 ???????????} ???????????if (ereg.test(idcard)) {//测试出生日期的合法性 ???????????????//计算校验位 ???????????????S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7 ???????????????????+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9 ???????????????????+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10 ???????????????????+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5 ???????????????????+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8 ???????????????????+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4 ???????????????????+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2 ???????????????????+ parseInt(idcard_array[7]) * 1 ???????????????????+ parseInt(idcard_array[8]) * 6 ???????????????????+ parseInt(idcard_array[9]) * 3; ???????????????Y = S % 11; ???????????????M = "F"; ???????????????JYM = "10X98765432"; ???????????????M = JYM.substr(Y, 1); ???????????????/*判断校验位*/ ???????????????if (M == idcard_array[17]) { ?/*检测ID的校验位false;*/ ???????????????????return true; ???????????????} else if (idcard_array[17] == ‘A‘) {//A结尾不校验规则 ???????????????????return true; ???????????????????/*检测ID的校验位false;*/ ???????????????} else { ???????????????????return false; ???????????????} ???????????} ???????????else { ???????????????return false; ???????????} ???????????break; ???????default: ???????????return false; ???} }
从身份证号码中获取相关信息,比如生日,省:
function checkID(ID) { ???if(typeof ID !== ‘string‘) return ‘非法字符串‘; ???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:"国外"}; ???var birthday = ID.substr(6, 4) + ‘/‘ + Number(ID.substr(10, 2)) + ‘/‘ + Number(ID.substr(12, 2)); ???var d = new Date(birthday); ???var newBirthday = d.getFullYear() + ‘/‘ + Number(d.getMonth() + 1) + ‘/‘ + Number(d.getDate()); ???var currentTime = new Date().getTime(); ???var time = d.getTime(); ???var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; ???var arrCh = [‘1‘, ‘0‘, ‘X‘, ‘9‘, ‘8‘, ‘7‘, ‘6‘, ‘5‘, ‘4‘, ‘3‘, ‘2‘]; ???var sum = 0, i, residue; ?????if(!/^\d{17}(\d|x)$/i.test(ID)) return ‘非法身份证‘; ???if(city[ID.substr(0,2)] === undefined) return "非法地区"; ???if(time >= currentTime || birthday !== newBirthday) return ‘非法生日‘; ???for(i=0; i<17; i++) { ?????sum += ID.substr(i, 1) * arrInt[i]; ???} ???residue = arrCh[sum % 11]; ???if (residue !== ID.substr(17, 1)) return ‘非法身份证哦‘; ?????return city[ID.substr(0,2)]+","+birthday+","+(ID.substr(16,1)%2?" 男":"女") ?}
验证香港身份证的格式或真实性:
function IsHKID(str) { ???var strValidChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ????// basic check length ???if (str.length < 8) ???????return false; ?????// handling bracket ???if (str.charAt(str.length-3) == ‘(‘ && str.charAt(str.length-1) == ‘)‘) ???????str = str.substring(0, str.length - 3) + str.charAt(str.length -2); ????// convert to upper case ???str = str.toUpperCase(); ????// regular expression to check pattern and split ???var hkidPat = /^([A-Z]{1,2})([0-9]{6})([A0-9])$/; ???var matchArray = str.match(hkidPat); ????// not match, return false ???if (matchArray == null) ???????return false; ????// the character part, numeric part and check digit part ???var charPart = matchArray[1]; ???var numPart = matchArray[2]; ???var checkDigit = matchArray[3]; ????// calculate the checksum for character part ???var checkSum = 0; ???if (charPart.length == 2) { ???????checkSum += 9 * (10 + strValidChars.indexOf(charPart.charAt(0))); ???????checkSum += 8 * (10 + strValidChars.indexOf(charPart.charAt(1))); ???} else { ???????checkSum += 9 * 36; ???????checkSum += 8 * (10 + strValidChars.indexOf(charPart)); ???} ????// calculate the checksum for numeric part ???for (var i = 0, j = 7; i < numPart.length; i++, j--) ???????checkSum += j * numPart.charAt(i); ????// verify the check digit ???var remaining = checkSum % 11; ???var verify = remaining == 0 ? 0 : 11 - remaining; ????return verify == checkDigit || (verify == 10 && checkDigit == ‘A‘);}
在网上找了很久都没合意的验证方式,最后通过Google找到一个国外写的js验证,发现可以使用。
上面那段验证的很精密,包含身份证真实性的校验,如果只是想验证输入的香港身份证格式,请使用下面的这段js。
function IsHKID(str) { ???var strValidChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ????// basic check length ???if (str.length < 8) ???????return false; ?????// handling bracket ???if (str.charAt(str.length-3) == ‘(‘ && str.charAt(str.length-1) == ‘)‘) ???????str = str.substring(0, str.length - 3) + str.charAt(str.length -2); ????// convert to upper case ???str = str.toUpperCase(); ????// regular expression to check pattern and split ???var hkidPat = /^([A-Z]{1,2})([0-9]{6})([A0-9])$/; ???var matchArray = str.match(hkidPat); ????// not match, return false ???if (matchArray == null) ???????return false; ???return true; }
来源:https://www.css88.com/archives/7982
常用js工具类之关于身份证号码验证的几个实用函数
原文地址:https://www.cnblogs.com/mhxy13867806343/p/10298132.html