身份证验证
创作时间:
作者:
@小白创作中心
身份证验证
引用
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);
}
});
总结
身份证验证在前端表单处理中至关重要。通过正则表达式、长度校验、校验码验证等方法,可以有效提高身份证验证的准确性和可靠性。结合前后端验证,可以确保数据的安全性。
热门推荐
年度工作总结:高效团队建设的五大关键
汉代陶扑满:“满则扑之”的人生启迪
曼波是什么意思?了解‘曼波’舞蹈和音乐的定义
如何验证Web服务器正常工作
构造柱设置要求及作用
案例展示模板
注意!鼻子和耳朵不要清洁过度,太干净反而不好,不利健康!
沪铜是什么产品?泸铜的市场行情如何?
如何制定有效的安全风险分级管控制度?
期转现的具体含义是什么?实施期转现需要注意什么?
青年余华与我们——为什么今天的青年还在阅读余华?
碳化硅(SiC)功率器件:新能源汽车的“心脏”革命与技术突围
三毛作品整理及经典语句摘抄
岩棉板的防火等级及优缺点解析
上清派之茅山祖师三茅真君
乡村振兴,青年有为——“希望田野”把青春的种子撒进乡村振兴的土壤
漏打卡按旷工算劳动仲裁:企业考勤管理中的法律风险与应对策略
江苏大学化学化工学院:创新化工类卓越人才培养模式
意面文化探索:意大利面的历史与演变
脾胃虚弱的人每天跑步1小时有好处吗?
劳动争议如何处理
这场比赛有多精彩?吉尔吉斯斯坦于卡塔尔,谁将创造奇迹?
契税和土地增值税的区别解析!火速了解清楚
阴离子型聚丙烯酰胺的应用与性能:广泛用于水处理、石油开采等领域
《流浪地球2》中用核弹炸毁月球的构思来自于何处?
深读|“就业悖论”该如何破解?来自春招“末班车”的调研与思考
如何服用小柴胡颗粒
曾是世界几大文明交汇点的龟兹,有了专属博物馆
不确定性增加!航运业每前行一步都是风险
自行车轴承全指南