any-rule
any-rule copied to clipboard
有大神写的出真实的身份证号(严格校验)
校验网站:http://www.ip33.com/shenfenzheng.html 这个是正确的身份证:513722198007101089 这个是错误的身份证:513722198007101088

正则应该是不可以计算的吧
感谢反馈, 研究研究, 不过正则只能穷举各种流程
可以考虑增加对身份证前两位校验,这个是有字典的 出生年月日也可以进行简单校验,月在01-12之间,日在01-31之间,年份其实也不会有小于1800年 真正严格的校验,还是推荐代码,如 https://github.com/dromara/hutool/blob/v5-master/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java
可以考虑增加对最近两个月份之间的对比,这个也是有两个出生年份的 月份天可以简单地进行计算,月在01-12之间,日在01-31之间,其实也有不如1800年 真正严格的标准,还是推荐代码,如 https://github.com/dromara/hutool/blob/v5-master/hutool-core/src/main/java/cn/hu/core/util/ IdcardUtil.java
代码这个已经写出来了的,这个是严格校验的代码
function verifyIDCard (val) {
const reg = /^(^\d{18}$|^\d{17}(\d|X|x))$/
if (!reg.test(val)) {
return false
}
let count = 0
// 从第一位到第十七位的系数
let coefficientList = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
for (let i = 0; i < 17; i++) {
let n = val.substr(i, 1)
n = parseInt(n)
count += coefficientList[i] * n
}
let remainder = count % 11
let r = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]
let v = r[remainder]
if (v === 10) { v = 'x' }
let l = val.substr(17, 1)
// eslint-disable-next-line eqeqeq
if (v != l.toLowerCase()) {
return false
}
return true
}
要用正则表达式校验这个,难如登天……