-
第一部分是定义了一个函数
validateIdnumber
,该函数接受三个参数:rule
、value
和callback
,其中value
为需要验证的身份证号码。 -
接着是对输入的身份证号码进行各种校验:
- 首先定义了一个正则表达式
format
,用于检查身份证号码的格式是否符合规定。 - 然后提取身份证号码中的年、月、日信息,并将其转换为时间戳。
- 接着定义了两个数组
c
和b
,分别存储了系数和校验码对照表。 - 计算身份证号码前17位数字与相应系数的乘积之和
sum
。
- 首先定义了一个正则表达式
-
在校验部分,根据不同情况调用回调函数
callback
并传递相应的错误信息:- 如果身份证号码不符合规则,则返回错误提示 '身份证号码不合规'。
- 如果出生日期不合规(超过当前日期或者日期超过当月天数),则返回错误提示 '出生日期不合规'。
- 如果身份证校验码不正确,则返回错误提示 '身份证校验码不合规'。
- 如果身份证号码为空,则返回错误提示 '请填写身份证号'。
- 如果以上情况都没有问题,则调用
callback
函数而不传递任何参数,表示验证通过。
const validateIdnumber = (rule, value, callback) => {
if (value) {
// 1 "验证通过!", 0 //校验不通过 // id为身份证号码
// 号码规则校验
var format =
/^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4}(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/
// 区位码校验
// 出生年月日校验 前正则限制起始年份为1900;
const year = value.substr(6, 4) // 身份证年
const month = value.substr(10, 2) // 身份证月
const date = value.substr(12, 2) // 身份证日
const time = Date.parse(month + '-' + date + '-' + year) // 身份证日期时间戳date
const nowTime = Date.parse(new Date()) // 当前时间戳
const dates = new Date(year, month, 0).getDate() // 身份证当月天数
// 校验码判断
var c = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] // 系数
var b = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] // 校验码对照表
var idArray = value.split('')
var sum = 0
for (var k = 0; k < 17; k++) {
sum += parseInt(idArray[k]) * parseInt(c[k])
}
if (!format.test(value)) {
// 号码规则校验
callback(new Error('身份证号码不合规'))
} else if (time > nowTime || date > dates) {
// 出生年月日校验 前正则限制起始年份为1900;
callback(new Error('出生日期不合规'))
} else if (idArray[17].toUpperCase() !== b[sum % 11].toUpperCase()) {
// 校验码判断
callback(new Error('身份证校验码不合规'))
} else {
callback()
}
} else {
callback(new Error('请填写身份证号'))
}
}