javascript身份證號碼校驗

faker發表於2019-02-16

由於專案需要,程式碼需要驗證身份證,摸索著學習,寫了一個驗證函式,直接上程式碼:

省級地址:

華北: 北京11,天津12,河北13,山西14,內蒙古15
東北: 遼寧21,吉林22,黑龍江23
華東: 上海31,江蘇32,浙江33,安徽34,福建35,江西36,山東37
華中: 河南41,湖北42,湖南43
華南: 廣東44,廣西45,海南46
西南: 四川51,貴州52,雲南53,西藏54,重慶50
西北: 陝西61,甘肅62,青海63,寧夏64,新疆65
特別: 臺灣71,香港81,澳門82

校驗規則按級來劃分:

1.後四位生成碼,這幾位碼的生成規則請自行百度,官方給了一個公式和表
2.年月日
3.前六位代表區域的值
// 驗證後四位生成碼
let checkCode = function (val) {
    var p = /^[1-9]d{5}(18|19|20)d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$/;
    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 code = val.substring(17);
    if (p.test(val)) {
        var sum = 0;
        for (var i = 0; i < 17; i++) {
            sum += val[i] * factor[i];
        }
        if (parity[sum % 11] == code.toUpperCase()) {
            return true;
        }
    }
    return false;
}
// 驗證年月日
let checkDate = function (val) {
    var pattern = /^(18|19|20)d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
    if (pattern.test(val)) {
        var year = val.substring(0, 4);
        var month = val.substring(4, 6);
        var date = val.substring(6, 8);
        var date2 = new Date(year + "-" + month + "-" + date);
        if (date2 && date2.getMonth() == (parseInt(month) - 1)) {
            return true;
        }
    }
    return false;
}
// 驗證地區區域轄區的值
let checkProv = function (val) {
    let pattern = /^[1-9][0-9]/;
    let provs = {
        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: "澳門"
    };
    if (pattern.test(val)) {
        if (provs[val]) {
            return true;
        }
    }
    return false;
}

驗證:

let checkID = function (val) {
    if (checkCode(val)) {
        var date = val.substring(6, 14);
        if (checkDate(date)) {
            if (checkProv(val.substring(0, 2))) {
                return true;
            }
        }
    }
    return false;
}
checkID(`身份證號`);

相關文章