own-js
Version:
自家前端交流在项目开发中构建的JS工具库,内含项目中最常用的JS工具函数
122 lines (118 loc) • 4.44 kB
text/typescript
/**
* 验证身份证号是否正确
* 验证成功返回空字符串,验证失败返回错误消息
* @param value 身份证号
*/
export const validateIdCard = (idcard: string): string => {
const Errors = [
'验证通过!',
'身份证号码不是15位或18位(' + idcard.trim() + ',实际位数:' + idcard.trim().length + ')!',
'身份证号码出生日期超出范围或含有非法字符!',
'身份证号码校验错误!',
'身份证地区非法!',
'身份证号不能为空!'
]
if (!idcard) {
return Errors[5]
}
idcard = idcard.replace(/\s/g, '')
if (!idcard) {
return Errors[5]
}
const area: any = {
11: '北京',
12: '天津',
13: '河北',
14: '山西',
15: '内蒙古',
21: '辽宁',
22: '吉林',
23: '黑龙江',
31: '上海',
32: '江苏',
33: '浙江',
34: '安徽',
35: '福建',
36: '江西',
37: '山东',
41: '河南',
42: '湖北',
43: '湖南',
44: '广东',
45: '广西',
46: '海南',
50: '重庆',
51: '四川',
52: '贵州',
53: '云南',
54: '西藏',
61: '陕西',
62: '甘肃',
63: '青海',
64: '宁夏',
65: '新疆',
71: '台湾',
81: '香港',
82: '澳门',
91: '国外'
}
let Y, JYM
let S, M
let idcardArray = []
idcardArray = idcard.split('')
// 地区检验
if (area[Number(idcard.substring(0, 2))] === null) {
return Errors[4]
}
let ereg
// 身份号码位数及格式检验
switch (idcard.trim().length) {
case 15:
if (
(parseInt(idcard.substring(6, 2)) + 1900) % 4 === 0 || ((parseInt(idcard.substring(6, 2)) + 1900) % 100 === 0 && (parseInt(idcard.substring(6, 2)) + 1900) % 4 === 0)) {
ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/ // 测试出生日期的合法性
} else {
ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/ // 测试出生日期的合法性
}
if (ereg.test(idcard)) {
return ''
} else {
return Errors[2]
}
case 18:
// 18位身份号码检测
// 出生日期的合法性检查
// 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
// 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
if (parseInt(idcard.substring(6, 4)) % 4 === 0 || (parseInt(idcard.substring(6, 4)) % 100 === 0 && parseInt(idcard.substring(6, 4)) % 4 === 0)) {
ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/ // 闰年出生日期的合法性正则表达式
} else {
ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/ // 平年出生日期的合法性正则表达式
}
if (ereg.test(idcard)) { // 测试出生日期的合法性
// 计算校验位
S = (parseInt(idcardArray[0]) + parseInt(idcardArray[10])) * 7 +
(parseInt(idcardArray[1]) + parseInt(idcardArray[11])) * 9 +
(parseInt(idcardArray[2]) + parseInt(idcardArray[12])) * 10 +
(parseInt(idcardArray[3]) + parseInt(idcardArray[13])) * 5 +
(parseInt(idcardArray[4]) + parseInt(idcardArray[14])) * 8 +
(parseInt(idcardArray[5]) + parseInt(idcardArray[15])) * 4 +
(parseInt(idcardArray[6]) + parseInt(idcardArray[16])) * 2 +
parseInt(idcardArray[7]) * 1 + parseInt(idcardArray[8]) * 6 +
parseInt(idcardArray[9]) * 3
Y = S % 11
M = 'F'
JYM = '10X98765432'
M = JYM.substring(Y, 1) // 判断校验位
if (M.toUpperCase() === idcardArray[17].toUpperCase()) {
return '' // 检测ID的校验位
} else {
return Errors[3]
}
} else {
return Errors[2]
}
default:
return Errors[1]
}
}