身份证验证
创作时间:
作者:
@小白创作中心
身份证验证
引用
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);
}
});
总结
身份证验证在前端表单处理中至关重要。通过正则表达式、长度校验、校验码验证等方法,可以有效提高身份证验证的准确性和可靠性。结合前后端验证,可以确保数据的安全性。
热门推荐
给孩子讲的家乡故事:去往村里小学的土路
如何在 Minecraft 中制作盔甲架
我的世界盔甲架合成攻略:从基础材料到最终成品
电冰箱维修指南:15种常见故障的快速修理方法
宝宝的血糖健康:新生儿低血糖如何监测
滚筒洗衣机的8个小毛病,原来,都是因为平时错用导致的!
北京特色小吃|爪王烤鸡手:一家只在晚上营业的东北风味小店
如何正确选购安全凤爪?这份实用指南请收好
家庭自制鸡爪:三种口味任你选,让你秒变大厨!
鸡爪:美容养颜+强壮骨骼的秘密武器!
从餐桌到文化:鸡爪的美食之旅与文化密码
金木水火土年份对照表简单查
甄家湾古村:影视拍摄助力乡村振兴的新探索
消费券方兴未艾:出路还是套路?
段春霞老师的亲子厨房:南瓜饼DIY
南瓜饼:秋季养生新宠!
天健美食坊教你做南瓜饼
甘肃食家巷南瓜饼:陇原风味的传承
象牙山的冬日童话:《乡村爱情》拍摄地探秘
从《去有风的地方》到《我在风起的云端等你》:影视作品助力乡村文化传承
西咪替丁:药物相互作用大揭秘
服用西咪替丁期间,这些饮食和用药注意事项请收好
西咪替丁:正确使用避免副作用
青岩古镇&天河潭:贵阳必打卡自然景观
哈佛研究:长期使用染发剂会增加患癌风险
灰白染:让你优雅告别白发焦虑!
大三元虾饺:从广州茶楼到世界餐桌
《舌尖上的中国》推荐:虾饺的前世今生
黄山特产大盘点:从名茶到水果,这些食材你都尝过吗?
火腿炖甲鱼:在家也能做正宗徽菜!