JavaScript前端实现身份证号校验
作者:蜚鸣
这篇文章主要为大家详细介绍了JavaScript前端实现身份证号校验的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
身份证号校验规则
身份证号码的校验主要基于国家标准GB11643-1999,18位身份证号的最后一位是校验码,通过前17位计算得出。校验算法分为以下几个部分:
校验码计算方法
1.加权因子
前17位数字分别乘以对应的加权因子,加权因子为固定值:
[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
2.计算加权和
将前17位数字与加权因子逐位相乘,再将结果相加,得到加权和 S。
3.取模计算
用加权和 S 除以11,取余数 Y = S % 11。
4.校验码对应表
根据余数 Y 的值,从下表查找对应的校验码:
[1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2]
校验码为第 Y 位的字符(从0开始)。
实现代码
function validateIDCard(idCard) {
// 基本格式校验
if (!/^\d{17}[\dXx]$/.test(idCard)) {
return false;
}
// 加权因子
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
// 校验码对应表
const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
// 计算加权和
let sum = 0;
for (let i = 0; i < 17; i++) {
sum += parseInt(idCard.charAt(i)) * weights[i];
}
// 计算校验码
const mod = sum % 11;
const checkCode = checkCodes[mod];
// 校验最后一位
return idCard.charAt(17).toUpperCase() === checkCode;
}
其他校验规则
1.行政区划码校验
前6位是行政区划码,需符合国家行政区划编码规则(可通过公开的行政区划代码表校验)。
2.出生日期校验
第7-14位是出生日期,需为合法日期(如月份在1-12之间,日期符合当月天数)。
3.顺序码校验
第15-17位是顺序码,奇数表示男性,偶数表示女性。
完整校验函数
function fullValidateIDCard(idCard) {
// 基本格式校验
if (!/^\d{17}[\dXx]$/.test(idCard)) {
return false;
}
// 校验行政区划码(示例:仅校验前2位为省级代码)
const provinceCode = idCard.substring(0, 2);
if (parseInt(provinceCode) > 91 || parseInt(provinceCode) < 11) {
return false;
}
// 校验出生日期
const birthDate = idCard.substring(6, 14);
const year = parseInt(birthDate.substring(0, 4));
const month = parseInt(birthDate.substring(4, 6));
const day = parseInt(birthDate.substring(6, 8));
const date = new Date(year, month - 1, day);
if (
date.getFullYear() !== year ||
date.getMonth() + 1 !== month ||
date.getDate() !== day
) {
return false;
}
// 校验校验码
return validateIDCard(idCard);
}
知识扩展
JavaScript实现中国手机号校验
1.校验手机号的基本规则
中国大陆手机号为11位数字,通常以特定号段开头。常见号段包括:
- 移动:134、135、136、137、138、139、147、150、151、152、157、158、159、172、178、182、183、184、187、188、198
- 联通:130、131、132、145、155、156、166、171、175、176、185、186
- 电信:133、149、153、173、177、180、181、189、199
- 虚拟运营商:170、171
2.正则表达式校验方法
使用正则表达式进行简单校验:
function isPhoneNumber(phone) {
return /^1[3-9]\d{9}$/.test(phone);
}
更精确的号段校验:
function isPhoneNumberStrict(phone) {
return /^1(3[0-9]|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/.test(phone);
}
3.分段校验方法
如果需要更精确的校验,可以将号段拆分为数组:
const segments = [
// 移动
'134','135','136','137','138','139','147','150','151','152',
'157','158','159','172','178','182','183','184','187','188','198',
// 联通
'130','131','132','145','155','156','166','171','175','176','185','186',
// 电信
'133','149','153','173','177','180','181','189','199'
];
function isPhoneNumberSegment(phone) {
if (!/^1\d{10}$/.test(phone)) return false;
return segments.includes(phone.substring(0, 3));
}4.国际化考虑
对于国际手机号校验,可以使用更通用的正则表达式:
function isInternationalPhone(phone) {
return /^\+?[1-9]\d{1,14}$/.test(phone);
}
4.实际应用建议
在实际项目中,建议:
- 前端进行简单格式校验
- 后端进行更严格的校验
- 通过短信验证码进行最终验证
5.前端完整校验示例:
function validatePhone(phone) {
const cleaned = phone.replace(/\D/g, '');
if (!/^1\d{10}$/.test(cleaned)) return false;
const segment = cleaned.substring(0, 3);
const segments = [
'130','131','132','133','134','135','136','137','138','139',
'145','147','149','150','151','152','153','155','156','157',
'158','159','166','170','171','172','173','175','176','177',
'178','180','181','182','183','184','185','186','187','188',
'189','198','199'
];
return segments.includes(segment);
}注意事项
- 15位身份证号无校验码,需升级为18位后再校验。
- 行政区划码和出生日期校验需结合实际需求补充完整逻辑。
- 校验码计算区分大小写(
X必须大写)。
到此这篇关于JavaScript前端实现身份证号校验的文章就介绍到这了,更多相关JavaScript身份证号校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
