身份证验证
创作时间:
作者:
@小白创作中心
身份证验证
引用
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);
}
});
总结
身份证验证在前端表单处理中至关重要。通过正则表达式、长度校验、校验码验证等方法,可以有效提高身份证验证的准确性和可靠性。结合前后端验证,可以确保数据的安全性。
热门推荐
NumPy详细教程:从入门到精通
毛发移植的成功率和失败率:从真实案例中学习。
减肥必看!这2件事做对了,体重想不降都难
台灣人說靠北是什麼意思?深入解析與文化背景
小儿中耳炎症状
ARK 2最新进展:全新DLC连接ARK 2,杨紫琼加盟配音
温暖患者就医路!广东这家医院打造中医妇科人文关怀病房
如何使用 Git 进行多人协作开发(全流程图解)
痛风能不能喝豆浆?
看完《钱氏家训》才懂:什么是一个家族,最上等的风水
培养好奇心的最佳同伴:推荐几本揭秘事物构造的优秀儿童科普书籍
如何分析 ETF 的行业发展趋势与宏观经济的关系和影响?对投资决策有何启示?
调色的基础知识
医生至少花15分钟给出的报告被AI工具几分钟搞定 “AI看病”怎样望闻问切?
换热机组的热效率如何计算和提高?
鸣潮布兰特全面解析:奶盾输出全能副C
白领脸疼张嘴困难,“打飞的”来武汉求医,颞下颌关节紊乱MDT门诊解疑难
银行保险代理业务中的投保年龄限制
孕妇能否食用乌鸡汤?营养与注意事项全解析
什么汤适合7个月的孕妇食用
中医药参与,让晚期肺癌患者“带瘤生存”
猫可以吃玉米吗?探究猫咪与玉米的关系
咽干、有痰却咳不出且反复发作……拿什么解救慢性咽炎?
医生:50岁后常有6种不适,建议及时休息
“清”字的多重含义与文化象征
青浦广电往事:一座铁塔,半世纪电波长歌
口红检测:从核心指标到国际标准的全方位解析
AI分为哪几种?了解AI人工智能分类与应用
阿比西尼亚猫:温顺优雅的“兔子猫”
请不要再把“沈阳”写错了!