js 实现身份证信息校验

用于身份证号码的比对校验

    checkIdentity(value) {
        if (value.length === 15) return true;
        if (value.length !== 18) return false;
        const address = value.substring(0, 6); // 6位,地区代码
        const birthday = value.substring(6, 14); // 8位,出生日期
        const province = {
            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: '澳门',
        };
        const year = birthday.substring(0, 4);
        const month = birthday.substring(4, 6);
        const day = birthday.substring(6);
        const tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day));
        if (province[parseInt(address.substr(0, 2), 10)] == null ||
            (tempDate.getFullYear() !== parseFloat(year) ||
                tempDate.getMonth() !== parseFloat(month) - 1 || tempDate.getDate() !== parseFloat(day))) {
            // 这里用getFullYear()获取年份,避免千年虫问题
            return false;
        }
        const weightedFactors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]; // 加权因子
        const valideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]; // 身份证验证位值,当中10代表X
        const certificateNoArray = value.split(''); // 得到身份证数组
        let sum = 0; // 声明加权求和变量
        if (certificateNoArray[17].toLowerCase() === 'x') {
            certificateNoArray[17] = 10; // 将最后位为x的验证码替换为10
        }
        for (let i = 0; i < 17; i += 1) {
            sum += weightedFactors[i] * certificateNoArray[i]; // 加权求和
        }
        const valCodePosition = sum % 11; // 得到验证码所在位置
        if (Number(certificateNoArray[17]) === valideCode[valCodePosition]) return true;
        return false;
    }

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整精确的身份证校验应该包括以下内容: 1. 身份证号码格式校验:长度、前17位是否为数字、最后一位是否为数字或大写字母X。 2. 地区码校验:前2位是否为有效的省、直辖市、自治区或特别行政区代码。 3. 出生日期码校验:第7~14位是否为有效的日期格式。 4. 校验码计算:根据前17位数字和加权因子计算校验码,并与身份证号码的第18位进行比较。 下面的JS代码可以实现完整精确的身份证校验: ```javascript function isValidIdCard(idCard) { var areaCode = [ // 省、直辖市代码表 '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 factor = [ // 加权因子表 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]; var checkCode = [ // 校验码表 '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' ]; var idCardNo = idCard.toString().toUpperCase(); // 身份证号码格式校验 if (!/^\d{17}(\d|X)$/.test(idCardNo)) { return false; } // 地区码校验 if (areaCode.indexOf(idCardNo.substr(0, 2)) === -1) { return false; } // 出生日期码校验 var year = idCardNo.substr(6, 4), month = idCardNo.substr(10, 2), day = idCardNo.substr(12, 2), birthday = new Date(year + '/' + month + '/' + day); if (birthday.getFullYear() != year || (birthday.getMonth() + 1) != month || birthday.getDate() != day) { return false; } // 校验码计算 var sum = 0; for (var i = 0; i < 17; i++) { sum += parseInt(idCardNo.charAt(i)) * factor[i]; } var mod = sum % 11; if (checkCode[mod] != idCardNo.charAt(17)) { return false; } return true; } ``` 使用方法: ```javascript console.log(isValidIdCard('110101199003074518')); // true console.log(isValidIdCard('11010119900307451X')); // true console.log(isValidIdCard('11010119900307')); // false console.log(isValidIdCard('110101199003074519')); // false console.log(isValidIdCard('310101199003074518')); // true console.log(isValidIdCard('31010119900307451X')); // true console.log(isValidIdCard('31010119900307')); // false console.log(isValidIdCard('310101199003074519')); // false console.log(isValidIdCard('88888888888888888X')); // false ``` 注意:该校验方法仅适用于大陆居民身份证号码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值