any-rule icon indicating copy to clipboard operation
any-rule copied to clipboard

有大神写的出真实的身份证号(严格校验)

Open ByePastHub opened this issue 3 years ago • 5 comments

校验网站:http://www.ip33.com/shenfenzheng.html 这个是正确的身份证:513722198007101089 这个是错误的身份证:513722198007101088

image

ByePastHub avatar Nov 27 '21 14:11 ByePastHub

正则应该是不可以计算的吧

ByePastHub avatar Nov 27 '21 14:11 ByePastHub

感谢反馈, 研究研究, 不过正则只能穷举各种流程

any86 avatar Nov 29 '21 12:11 any86

可以考虑增加对身份证前两位校验,这个是有字典的 出生年月日也可以进行简单校验,月在01-12之间,日在01-31之间,年份其实也不会有小于1800年 真正严格的校验,还是推荐代码,如 https://github.com/dromara/hutool/blob/v5-master/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java

chaos-cn avatar Jan 21 '22 08:01 chaos-cn

可以考虑增加对最近两个月份之间的对比,这个也是有两个出生年份的 月份天可以简单地进行计算,月在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
}

ByePastHub avatar Jan 21 '22 08:01 ByePastHub

要用正则表达式校验这个,难如登天……

xjzh123 avatar Mar 24 '24 10:03 xjzh123