问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

身份证验证

创作时间:
作者:
@小白创作中心

身份证验证

引用
1
来源
1.
https://docs.pingcode.com/baike/2452778

正则表达式

正则表达式是一种强大的工具,用于匹配字符串中的模式。在身份证验证中,正则表达式可以用于初步筛选出那些不符合格式的身份证号。中国身份证号通常是18位的数字,前17位是出生日期和地区编码等信息,第18位是校验码。

const idCardPattern = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/;

前端使用正则表达式进行身份证验证,通常是在表单提交时进行验证。以下是一个简单的示例:

function validateIdCard(idCard) {
    const idCardPattern = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/;
    return idCardPattern.test(idCard);
}

这个函数可以在表单提交时调用,确保用户输入的身份证号符合基本格式。

长度校验

中国的身份证号长度通常是18位,但部分旧版身份证号可能是15位。为了确保用户输入的身份证号长度正确,可以在正则表达式验证的基础上,增加长度校验。

function validateIdCardLength(idCard) {
    return idCard.length === 18 || idCard.length === 15;
}

为了提高验证的准确性,可以将正则表达式和长度校验结合起来:

function validateIdCard(idCard) {
    const idCardPattern = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/;
    return idCardPattern.test(idCard) && validateIdCardLength(idCard);
}

校验码验证

身份证的第18位是校验码,可以是数字或字母X。校验码的计算方法是根据身份证号前17位的特定算法得出的。具体算法如下:

function calculateChecksum(idCard) {
    const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    const checksums = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
    let sum = 0;
    for (let i = 0; i < 17; i++) {
        sum += idCard[i] * weights[i];
    }
    const mod = sum % 11;
    return checksums[mod];
}

在验证身份证号时,还需要检查校验码是否正确:

function validateIdCard(idCard) {
    const idCardPattern = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/;
    if (!idCardPattern.test(idCard)) {
        return false;
    }
    const checksum = calculateChecksum(idCard);
    return idCard[17] === checksum;
}

前端表单处理

在实际应用中,身份证验证通常是表单处理的一部分。以下是一个完整的示例,展示了如何在表单提交前验证身份证号:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>身份证验证</title>
</head>
<body>
    <form id="idCardForm">
        <label for="idCard">身份证号:</label>
        <input type="text" id="idCard" name="idCard" required>
        <button type="submit">提交</button>
    </form>
    <script>
        function calculateChecksum(idCard) {
            const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
            const checksums = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
            let sum = 0;
            for (let i = 0; i < 17; i++) {
                sum += idCard[i] * weights[i];
            }
            const mod = sum % 11;
            return checksums[mod];
        }
        function validateIdCard(idCard) {
            const idCardPattern = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/;
            if (!idCardPattern.test(idCard)) {
                return false;
            }
            const checksum = calculateChecksum(idCard);
            return idCard[17] === checksum;
        }
        document.getElementById('idCardForm').addEventListener('submit', function(event) {
            const idCard = document.getElementById('idCard').value;
            if (!validateIdCard(idCard)) {
                event.preventDefault();
                alert('身份证号无效,请重新输入');
            }
        });
    </script>
</body>
</html>

在表单验证中,用户体验非常重要。当用户输入无效的身份证号时,需要及时提示用户,并引导他们进行正确的输入。

function validateIdCard(idCard) {
    const idCardPattern = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/;
    if (!idCardPattern.test(idCard)) {
        return { isValid: false, message: '身份证号格式不正确' };
    }
    const checksum = calculateChecksum(idCard);
    if (idCard[17] !== checksum) {
        return { isValid: false, message: '校验码错误' };
    }
    return { isValid: true };
}
document.getElementById('idCardForm').addEventListener('submit', function(event) {
    const idCard = document.getElementById('idCard').value;
    const validationResult = validateIdCard(idCard);
    if (!validationResult.isValid) {
        event.preventDefault();
        alert(validationResult.message);
    }
});

进一步优化

尽管前端可以进行初步的身份证验证,但为了确保安全性和准确性,后端也应进行二次验证。前后端结合可以有效防止用户绕过前端验证,提交无效数据。

// 前端提交数据
fetch('/validate-id-card', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({ idCard: idCard })
})
.then(response => response.json())
.then(data => {
    if (data.isValid) {
        // 身份证号有效,继续处理表单
    } else {
        alert(data.message);
    }
});

总结

身份证验证在前端表单处理中至关重要。通过正则表达式、长度校验、校验码验证等方法,可以有效提高身份证验证的准确性和可靠性。结合前后端验证,可以确保数据的安全性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号