回 帖 发 新 帖 刷新版面

主题:[原创]ASP 身份证验证/身份证检查/身份证号码验证/身份证号码检查 VB代码

Function checkIDCard(idcard) '-1为正确的身份证,否则为非法身份证
  
  Dim Y, JYM
  Dim S, M
  
  Dim area
  area = "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"
  Dim ereg
  Set ereg = New regexp
  
  '地区检验
  If InStr(1, area, Mid(idcard, 1, 2)) = 0 Then checkIDCard = 1: Exit Function
  
  '身份号码位数及格式检验
  Select Case Len(idcard)
  Case 15
    If ((CInt(Mid(idcard, 7, 2)) + 1900) Mod 4 = 0 Or ((CInt(Mid(idcard, 7, 2)) + 1900) Mod 100 = 0 And (CInt(Mid(idcard, 7, 2)) + 1900) Mod 4 = 0)) Then
    ereg.Pattern = "^[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.Pattern = "^[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}$" ';//测试出生日期的合法性
    End If
    If (ereg.test(idcard)) Then
      checkIDCard = -1
    Else
      checkIDCard = 2
    End If
  Case 18
    '//18位身份号码检测
    '//出生日期的合法性检查
    If ((CInt(Mid(idcard, 7, 2)) + 1900) Mod 4 = 0 Or ((CInt(Mid(idcard, 7, 2)) + 1900) Mod 100 = 0 And (CInt(Mid(idcard, 7, 2)) + 1900) Mod 4 = 0)) Then
      ereg.Pattern = "^[1-9][0-9]{5}19[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.Pattern = "^[1-9][0-9]{5}19[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]$" ';//平年出生日期的合法性正则表达式
    End If
    If (ereg.test(idcard)) Then
      '//计算校验位
      S = (CInt(Mid(idcard, 0 + 1, 1)) + CInt(Mid(idcard, 10 + 1, 1))) * 7 _
      + (CInt(Mid(idcard, 1 + 1, 1)) + CInt(Mid(idcard, 11 + 1, 1))) * 9 _
      + (CInt(Mid(idcard, 2 + 1, 1)) + CInt(Mid(idcard, 12 + 1, 1))) * 10 _
      + (CInt(Mid(idcard, 3 + 1, 1)) + CInt(Mid(idcard, 13 + 1, 1))) * 5 _
      + (CInt(Mid(idcard, 4 + 1, 1)) + CInt(Mid(idcard, 14 + 1, 1))) * 8 _
      + (CInt(Mid(idcard, 5 + 1, 1)) + CInt(Mid(idcard, 15 + 1, 1))) * 4 _
      + (CInt(Mid(idcard, 6 + 1, 1)) + CInt(Mid(idcard, 16 + 1, 1))) * 2 _
      + CInt(Mid(idcard, 7 + 1, 1)) * 1 _
      + CInt(Mid(idcard, 8 + 1, 1)) * 6 _
      + CInt(Mid(idcard, 9 + 1, 1)) * 3
      Y = S Mod 11
      M = "F"
      JYM = "10X98765432"
      M = Mid(JYM, Y + 1, 1)
      
      If (M = Mid(idcard, 17 + 1, 1)) Then checkIDCard = -1 Else checkIDCard = 3
    
    Else
      checkIDCard = 4
    End If
   
  Case Else
    checkIDCard = 5
  End Select

End Function

回复列表 (共3个回复)

沙发

好贴。

板凳

好东西,谢谢楼主分享

3 楼

这个不错哦  其实最好的还应该把身份证与地址的关系找出来呀  这样就完美了呀

我来回复

您尚未登录,请登录后再回复。点此登录或注册