做前台经常会遇到身份证验证的问题,今天写了一个js验证文件,验证升值、身份证号码,获取性别,生日。后期可能会获取所属地址。
/** * 验证身份证 * @param idcard 身份证号码 * @return result = {"pass":false,"node":""} */ function IDValidate(idcard){ var result = {"pass":false,"node":""}; if(!idcard){ result.node = "身份证号不能为空"; return result; } if( !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(idcard) ){ result.node = "身份证号格式错误"; return result; } 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:"国外"}; if(!city[idcard.substr(0,2)]){ result.node = "身份证号前两位地址编码错误"; return result; } //18位身份证需要验证最后一位校验位 if(idcard.length == 18){ idcard = idcard.split(''); var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];//∑(ai×Wi)(mod 11) 加权因子 var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];//校验位 var sum = 0; for (var i = 0; i < 17; i++){ sum += idcard[i] * factor[i]; } if(parity[sum % 11] != idcard[17]){ result.node = "身份证号末尾校验错误"; return result; } } result.pass = true; result.node = "身份证号验证正确"; return result; } /** * 获取性别,生日 * @param idcard 身份证号码 * @return info = {"birthdayText":"","birthdayValue":null,"genderText":"","genderValue":null}; */ function parseID(idcard){ if( !IDValidate(idcard).pass ){ return false; } var info = {"birthdayText":"","birthdayValue":null,"genderText":"","genderValue":null}; if (15 == idcard.length) { //15位身份证号码 var year = idcard.charAt(6) + idcard.charAt(7); if (parseInt(year) < 10) { year = '20' + year; }else{ year = '19' + year; } info.birthdayText = year + '-' + idcard.substring(8,10)+ '-' + idcard.substring(10,12); info.genderText = parseInt(idcard.charAt(14)) % 2 == 0 ? "女" : "男"; }else if (18 == idcard.length) { //18位身份证号码 info.birthdayText = idcard.substring(6,10)+"-"+idcard.substring(10,12)+"-"+idcard.substring(12,14); info.genderText = parseInt(idcard.charAt(16)) % 2 == 0 ? "女" : "男"; } info.birthdayValue = new Date(info.birthdayText.replace(/-/g,'/')+' 00:00:00'); info.genderValue = info.genderText == "男" ? 1 : 2; return info; } /** * 验证身份证号码 * @param idcard 身份证号码 * @return info = {"birthdayText":"","birthdayValue":null,"genderText":"","genderValue":null}; */ function checkIdcard(idcard){ return IDValidate(idcard).pass; }