在页面中通过js验证身份证合法性,通常是通过正則表達式或工具类进行推断。

以下是项目中验证身份证的合法性代码实现。
第一种:通过正則表達式进行简单校验。

if ($("#cardType").val() == "01") {
    var _cardNo = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
    if (!_cardNo.test(cardNo_val)) {
        $("#showerror").css("color", "#ff0000");
        $("#showerror").text("身份证号码格式 不对。");
        return false;
    }
}

另外一种是通过js工具类进行推断,工具类代码例如以下:

/* 简单身份证验证脚本
 *var ck=new Qhjsw.IDChecks("身份证号码");
 *var tip=ck.IDCk();
 *tip为一个对象(object)总共存在7个属性
 *msg 返回提示信息,不管是否通过验证均有此属性。比如:身份证格式错误、效验位错误
 *pass 返回bool值, 不管是否通过验证均有此属性。

值为true代表通过。false代表验证失败 *idcode 身份证号码,验证通过存在 *address 地址(仅仅限省份信息),验证通过存在 *sextag 性别标识,通过验证存在。0为女,1为男 *sex 返回性别为中文。男或女 *birthday 返回出生日期 18位身份证返回字符格式为YYYY-MM-DD 15位返回格式为YY-MM-DD 比如:1991-01-01(18位)、91-01-01(15位号码) * * *顺序类编码。无法确定。奇数为男。偶数为女 *校验码,该位数值可通过前17位计算获得 * 18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ] * 验证位 Y = [ 1, 0,'X' , 9, 8, 7, 6, 5, 4, 3, 2 ] * 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 ) */ var Qhjsw = {}; Qhjsw.IDChecks = function(Code) { 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 Tip = {}; // 创建一个空对象,此对象用来返回验证结果 var IDCode = Code; var code = []; // 创建一个空数组,用来保存被切割的身份证 var sextable = ["女", "男"]; // 创建数组,保存性别。表驱动 var Ck = function(IDCode) { if (!IDCode || !/(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^\d{6}(18|19|20){1}\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X|x)$)/i.test(IDCode)) { Tip.msg = "身份证号格式错误"; Tip.pass = false; } else if (!city[IDCode.substr(0, 2)]) { Tip.msg = "地址编码错误"; Tip.pass = false; } else if (!_CheckBirthday(IDCode)) { Tip.msg = "身份证中出生日期不对"; Tip.pass = false; } else { if (18 == IDCode.length) { code = IDCode.split(''); var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]; var sum = 0; var ai = 0; var wi = 0; if (typeof code[17] == "string") { code[17] = code[17].toUpperCase(); } for (var i = 0; i < 17; i++) { ai = code[i]; wi = factor[i]; sum += ai * wi; } if (parity[sum % 11] != code[17]) { Tip.msg = "身份证号格式错误"; Tip.pass = false; } else { Tip.msg = "该身份证验证正确"; Tip.pass = true; Tip.idcode = IDCode; Tip.address = city[IDCode.substr(0, 2)]; Tip.sextag = _GetSex(IDCode); Tip.sex = sextable[Tip.sextag]; Tip.birthday = _GetBirthday(IDCode); Tip.age = _GetAge(Tip.birthday); } } else { Tip.msg = "该身份证验证正确"; Tip.pass = true; Tip.idcode = IDCode; Tip.address = city[IDCode.substr(0, 2)]; Tip.sextag = _GetSex(IDCode); Tip.sex = sextable[Tip.sextag]; Tip.birthday = _GetBirthday(IDCode); Tip.age = _GetAge(Tip.birthday); } } }; this.IDCk = function() { Ck(IDCode); return Tip; }; function _CheckBirthday(IDCodes) { if (IDCodes.length == 18) { var year = IDCodes.substring(6, 10); var month = IDCodes.substring(10, 12); var day = IDCodes.substring(12, 14); var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day)); // 这里用getFullYear()获取年份,避免千年虫问题 if (temp_date.getFullYear() != parseFloat(year) || temp_date.getMonth() != parseFloat(month) - 1 || temp_date.getDate() != parseFloat(day)) { return false; } else { return true; } } else { var year = IDCodes.substring(6, 8); var month = IDCodes.substring(8, 10); var day = IDCodes.substring(10, 12); var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day)); // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法 if (temp_date.getYear() != parseFloat(year) || temp_date.getMonth() != parseFloat(month) - 1 || temp_date.getDate() != parseFloat(day)) { return false; } else { return true; } } } function _GetBirthday(IDCodes) { if (IDCodes.length == 18) { var year = IDCodes.substring(6, 10); var month = IDCodes.substring(10, 12); var day = IDCodes.substring(12, 14); return year + "-" + month + "-" + day; } else { var year = IDCodes.substring(6, 8); var month = IDCodes.substring(8, 10); var day = IDCodes.substring(10, 12); return year + "-" + month + "-" + day; } } function _GetSex(IDCodes) { if (IDCodes.length == 18) { if (IDCodes.substring(14, 17) % 2 == 0) { return 0; } else { return 1; } } else { if (IDCodes.substring(14, 15) % 2 == 0) { return 0; } else { return 1; } } } function _GetAge(bdate) { if (bdate != "") { var cd = new Date(); var age = cd.getFullYear() - parseInt(bdate.substring(0, 4)); var var_age = 0; if (cd.getMonth() >= parseInt(bdate.substring(5, 7))) { var_age = age; } else { var_age = age - 1; } return (var_age < 0 ? 0 : var_age); } } };

将工具类引入jsp文件,用法例如以下:

if ($("#cardType").val() == "01") {
    var ck = new Qhjsw.IDChecks(cardNo_val);
    var tip = ck.IDCk();
    if (!tip.pass) {
        $("#showerror").css("color", "#ff0000");
        $("#showerror").text("身份证号码格式 不对!");
        return false;
    }
}

java版验证身份证合法性和通过身份证算出年龄、性别、出生日期的參考:http://blog.csdn.net/zl544434558/article/details/44242083

posted on 2017-07-26 21:06  lxjshuju  阅读(500)  评论(0编辑  收藏  举报