身份證號碼的正則校驗+升級版

需求

驗證一個身份證號碼, 很簡單的需求
原本想搜一個正則,結果發現,錯誤的太多了,只能本身試着寫git

網上的一個方法(垃圾,不要用)

function check (val) {
    var reg = /[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x/  // 匹配14位或者17位或 16位數字後面加個x的
    return reg.test(val)
}

解讀正則github

[1-9]\d{14} 匹配14位數字
[1-9]\d{17} 匹配17位數字
[1-9]\d{16}x 匹配16位數字後面跟x數組

console.log(check('1111111111111111111111')) // true 這種鬼玩意都能匹配上

本身寫一個簡單的

在寫以前先研究下身份證的結構,這裏只研究18位的,由於15位的已通過期了!3d

分析code

xxxxxx yyyy mm ddd nnn v 十八位ci

xxxxxx地區: [1-9]\d{5}
年的前兩位: (18|19|20)
年的後兩位: \d{2}
月份: ((0[1-9])|(10|11|12))
天數: (([0-2][1-9])|10|20|30|31)
順序碼: \d{3}
驗證碼: [0-9Xx]get

正則表達: ^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$it

function check (val) {
    var reg = /[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x/  // 匹配14位或者17位或 16位數字後面加個x的
    return reg.test(val)
}


console.log(check('610102218801012344')) //年不對 false  610102  2188  01 01 234 4 

console.log(check('610102198801012344')) //true               610102  1988  01 01 234 4

升級版驗證

身份證的前6位表明地區
對應表 驗證中國身份證 前6位對應地區碼io

校驗碼的計算方法console

某男性的身份證號碼是340523198001010013。咱們要看看這個身份證是否是合法的身份證。
1.17位分別乘不一樣係數 let arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]結果相加

  1. 加出來除以11,看餘數
  2. 餘數對應數組let arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']的位置的值

舉個例子

首先咱們得出前17位的乘積和:
(3*7+4*9+0*10+5*5+2*8+3*4+1*2+9*1+8*6+0*3+0*7+1*9+0*10+1*5+0*8+0*4+1*2) = 185
而後再求餘:
185 % 11 = 9
最後經過對應規則就能夠知道餘數9對應的數字是3。因此,能夠斷定這是一個合格的身份證號碼。
function check(val) {
  const city = { '110000': '北京市',
    '110100': '北京市市轄區',
    '110101': '北京市東城區',
    '110102': '北京市西城區'........ }  // 對應的地區碼 上面有,數據太多這裏省略

  // 類型轉換
  let id = parseInt(val, 10)
  // 正則判斷基本類型
  if (!/^\d{17}(\d|x)$/i.test(id)) return false
  // 地區的判斷
  if (city[id.substr(0, 6)] === undefined) return false
  // 生日
  let birthday = id.substr(6, 4) + '/' + Number(id.substr(10, 2)) + '/' + Number(id.substr(12, 2))
  let d = new Date(birthday)
  let newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate())
  let currentTime = new Date().getTime()
  let time = d.getTime()
  if (time >= currentTime || birthday !== newBirthday) return false
  // 判斷校驗碼
  let arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
  let arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
  let sum = 0

  for (let i = 0; i < 17; i++) {
    sum += id.substr(i, 1) * arrInt[i]
  }
  let residue = arrCh[sum % 11]
  if (residue !== id.substr(17, 1)) return false

  return true 
}
相關文章
相關標籤/搜索