| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 677 人关注过本帖
标题:ASP 验证身份证号码的合法性
只看楼主 加入收藏
gxh012
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2008-2-10
结帖率:100%
收藏
 问题点数:0 回复次数:0 
ASP 验证身份证号码的合法性
用正则表达式函数验证身份证号码合法性 :

CREATE OR REPLACE FUNCTION fn_checkidcard (p_idcard IN VARCHAR2)
   RETURN INT
IS
   v_regstr      VARCHAR2 (2000);
   v_sum         NUMBER;
   v_mod         NUMBER;
   v_checkcode   CHAR (11)       := '10X98765432';
   v_checkbit    CHAR (1);
   v_areacode    VARCHAR2 (2000)
      := '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,';
BEGIN
   CASE LENGTHB (p_idcard)
      WHEN 15
      THEN                                                            -- 15位
         IF INSTRB (v_areacode, SUBSTR (p_idcard, 1, 2) || ',') = 0
         THEN
            RETURN 0;
         END IF;

         IF    MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 2)) 1900, 400) = 0
            OR (    MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 2)) 1900, 100) <>
                                                                             0
                AND MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 2)) 1900, 4) = 0
               )
         THEN                                                          -- 闰年
            v_regstr :=
               '^[1-9][0-9][0-9]((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]$';
         ELSE
            v_regstr :=
               '^[1-9][0-9][0-9]((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]$';
         END IF;

         IF REGEXP_LIKE (p_idcard, v_regstr)
         THEN
            RETURN 1;
         ELSE
            RETURN 0;
         END IF;
      WHEN 18
      THEN                                                             -- 18位
         IF INSTRB (v_areacode, SUBSTRB (p_idcard, 1, 2) || ',') = 0
         THEN
            RETURN 0;
         END IF;

         IF    MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 4)), 400) = 0
            OR (    MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 4)), 100) <> 0
                AND MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 4)), 4) = 0
               )
         THEN                                                          -- 闰年
            v_regstr :=
               '^[1-9][0-9]19[0-9]((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][0-9Xx]$';
         ELSE
            v_regstr :=
               '^[1-9][0-9]19[0-9]((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][0-9Xx]$';
         END IF;

         IF REGEXP_LIKE (p_idcard, v_regstr)
         THEN
            v_sum :=
                   (  TO_NUMBER (SUBSTRB (p_idcard, 1, 1))
                     TO_NUMBER (SUBSTRB (p_idcard, 11, 1))
                   )
                 * 7
                  (  TO_NUMBER (SUBSTRB (p_idcard, 2, 1))
                     TO_NUMBER (SUBSTRB (p_idcard, 12, 1))
                   )
                 * 9
                  (  TO_NUMBER (SUBSTRB (p_idcard, 3, 1))
                     TO_NUMBER (SUBSTRB (p_idcard, 13, 1))
                   )
                 * 10
                  (  TO_NUMBER (SUBSTRB (p_idcard, 4, 1))
                     TO_NUMBER (SUBSTRB (p_idcard, 14, 1))
                   )
                 * 5
                  (  TO_NUMBER (SUBSTRB (p_idcard, 5, 1))
                     TO_NUMBER (SUBSTRB (p_idcard, 15, 1))
                   )
                 * 8
                  (  TO_NUMBER (SUBSTRB (p_idcard, 6, 1))
                     TO_NUMBER (SUBSTRB (p_idcard, 16, 1))
                   )
                 * 4
                  (  TO_NUMBER (SUBSTRB (p_idcard, 7, 1))
                     TO_NUMBER (SUBSTRB (p_idcard, 17, 1))
                   )
                 * 2
               TO_NUMBER (SUBSTRB (p_idcard, 8, 1)) * 1
               TO_NUMBER (SUBSTRB (p_idcard, 9, 1)) * 6
               TO_NUMBER (SUBSTRB (p_idcard, 10, 1)) * 3;
            v_mod := MOD (v_sum, 11);
            v_checkbit := SUBSTRB (v_checkcode, v_mod 1, 1);

            IF v_checkbit = SUBSTRB (p_idcard, 18, 1)
            THEN
               RETURN 1;
            ELSE
               RETURN 0;
            END IF;
         ELSE
            RETURN 0;
         END IF;
      ELSE
         RETURN 0;                                      -- 身份证号码位数不对
   END CASE;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN 0;
END fn_checkidcard;                 http://www.



//http://
<SCRIPT LANGUAGE="JavaScript">
<!--
function checkIdcard(idcard){
var Errors=new Array(
"验证通过!",
"身份证号码位数不对!",
"身份证号码出生日期超出范围或含有非法字符!",
"身份证号码校验错误!",
"身份证地区非法!"
);
var 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:"国外"}

var idcard,Y,JYM;
var S,M;
var idcard_array = new Array();
idcard_array = idcard.split("");
//地区检验
if(area[parseInt(idcard.substr(0,2))]==null) return Errors[4];
//身份号码位数及格式检验
switch(idcard.length){
case 15:
if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
ereg=/^[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=/^[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}$/;//测试出生日期的合法性
}
if(ereg.test(idcard)) return Errors[0];
else return Errors[2];
break;
case 18:
//18位身份号码检测
//出生日期的合法性检查
//闰年月日:((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]))
//平年月日:((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]))
if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
ereg=/^[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=/^[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]$/;//平年出生日期的合法性正则表达式
}
if(ereg.test(idcard)){//测试出生日期的合法性
//计算校验位
S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
+ parseInt(idcard_array[7]) * 1
+ parseInt(idcard_array[8]) * 6
+ parseInt(idcard_array[9]) * 3 ;
Y = S % 11;
M = "F";
JYM = "10X98765432";
M = JYM.substr(Y,1);//判断校验位
if(M == idcard_array[17]) return Errors[0]; //检测ID的校验位
else return Errors[3];
}
else return Errors[2];
break;
default:
return Errors[1];
break;
}

}
var sss = "000000000000000000"
document.write (checkIdcard(sss))
//-->
</SCRIPT>


//////vbscript
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

[[it] 本帖最后由 gxh012 于 2008-2-12 18:20 编辑 [/it]]
搜索更多相关主题的帖子: 身份证号码 合法性 ASP 验证 INT 
2008-02-10 01:15
快速回复:ASP 验证身份证号码的合法性
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028971 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved