身份证号正则校验(js校验+JAVA校验)

转载自:http://www.cnblogs.com/jkfeng/p/4642804.html

js校验身份证号【15位和18位】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
[javascript] view plaincopyprint?
function scCard(){ 
     var scType=document.getElementById( "sc_card_type" ).value; 
     if (scType== "1" ){ 
      var scCard=document.getElementById( "sc_card_num" ).value; 
                       if (scCard.length!= 0 ){ 
                        if (!checkCard(scCard)){ 
                         $( "#errorTips" ).html( "身份证号码格式错误" ); 
                        } else
                         $( "#errorTips" ).html( "" ); 
                       
                      
    
     return  false
       
   
    //function checkidno(obj) { 
         
       var vcity={  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 : "国外" 
             }; 
    
    checkCard = function(obj) 
    
         //var card = document.getElementById('card_no').value; 
         //是否为空 
        // if(card === '') 
        // { 
               
       //     return false; 
         //} 
         //校验长度,类型 
         if (isCardNo(obj) ===  false
        
               
            return  false
        
         //检查省份 
         if (checkProvince(obj) ===  false
        
               
            return  false
        
         //校验生日 
         if (checkBirthday(obj) ===  false
        
               
            return  false
        
         //检验位的检测 
         if (checkParity(obj) ===  false
        
               
            return  false
        
         return  true
     }; 
       
       
     //检查号码是否符合规范,包括长度,类型 
     isCardNo = function(obj) 
    
         //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X 
         var reg = /(^\d{ 15 }$)|(^\d{ 17 }(\d|X)$)/; 
         if (reg.test(obj) ===  false
        
             return  false
        
       
         return  true
     }; 
       
     //取身份证前两位,校验省份 
     checkProvince = function(obj) 
    
         var province = obj.substr( 0 , 2 ); 
         if (vcity[province] == undefined) 
        
             return  false
        
         return  true
     }; 
       
     //检查生日是否正确 
     checkBirthday = function(obj) 
    
         var len = obj.length; 
         //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字 
         if (len ==  '15'
        
             var re_fifteen = /^(\d{ 6 })(\d{ 2 })(\d{ 2 })(\d{ 2 })(\d{ 3 })$/;  
            var arr_data = obj.match(re_fifteen); 
             var year = arr_data[ 2 ]; 
             var month = arr_data[ 3 ]; 
             var day = arr_data[ 4 ]; 
             var birthday =  new  Date( '19' +year+ '/' +month+ '/' +day); 
             return  verifyBirthday( '19' +year,month,day,birthday); 
        
         //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X 
         if (len ==  '18'
        
             var re_eighteen = /^(\d{ 6 })(\d{ 4 })(\d{ 2 })(\d{ 2 })(\d{ 3 })([ 0 - 9 ]|X)$/; 
             var arr_data = obj.match(re_eighteen); 
             var year = arr_data[ 2 ]; 
             var month = arr_data[ 3 ]; 
             var day = arr_data[ 4 ]; 
             var birthday =  new  Date(year+ '/' +month+ '/' +day); 
             return  verifyBirthday(year,month,day,birthday); 
        
         return  false
     }; 
       
     //校验日期 
     verifyBirthday = function(year,month,day,birthday) 
    
         var now =  new  Date(); 
         var now_year = now.getFullYear(); 
         //年月日是否合理 
         if (birthday.getFullYear() == year && (birthday.getMonth() +  1 ) == month && birthday.getDate() == day) 
        
             //判断年份的范围(3岁到100岁之间) 
             var time = now_year - year; 
             if (time >=  0  && time <=  130
            
                 return  true
            
             return  false
        
         return  false
     }; 
       
     //校验位的检测 
     checkParity = function(obj) 
    
         //15位转18位 
         obj = changeFivteenToEighteen(obj); 
         var len = obj.length; 
         if (len ==  '18'
        
             var arrInt =  new  Array( 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ); 
             var arrCh =  new  Array( '1' '0' 'X' '9' '8' '7' '6' '5' '4' '3' '2' ); 
             var cardTemp =  0 , i, valnum;  
            for (i =  0 ; i <  17 ; i ++)  
            {  
                cardTemp += obj.substr(i,  1 ) * arrInt[i];  
            }  
            valnum = arrCh[cardTemp %  11 ];  
            if  (valnum == obj.substr( 17 1 ))  
           
                 return  true
            
             return  false
        
         return  false
     }; 
       
     //15位转18位身份证号 
     changeFivteenToEighteen = function(obj) 
    
         if (obj.length ==  '15'
        
             var arrInt =  new  Array( 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ); 
             var arrCh =  new  Array( '1' '0' 'X' '9' '8' '7' '6' '5' '4' '3' '2' ); 
             var cardTemp =  0 , i;    
            obj = obj.substr( 0 6 ) +  '19'  + obj.substr( 6 , obj.length -  6 ); 
             for (i =  0 ; i <  17 ; i ++)  
            {  
                cardTemp += obj.substr(i,  1 ) * arrInt[i];  
            }  
            obj += arrCh[cardTemp %  11 ];  
            return  obj; 
        
         return  obj; 
     };

JAVA校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package  com.ebiz.base.utils;
 
import  java.text.SimpleDateFormat;
import  java.util.Date;
import  java.util.GregorianCalendar;
import  java.util.List;
import  java.util.regex.Matcher;
import  java.util.regex.Pattern;
 
import  com.ebiz.base.consts.BaseConst;
import  com.ebiz.base.consts.ConfigConst;
import  com.ebiz.base.consts.ExceptionConst;
import  com.ebiz.framework.util.date.DateUtil;
import  com.ebiz.framework.util.date.DateValidate;
import  com.ebiz.framework.util.validate.ValidateUtil;
import  com.ebiz.persistence.laputa.FndPageRule;
import  com.hp.hpl.sparta.ParseException;
 
public  class  CheckIdentificationUtil {
     public  static  void  main(String[] args)  {
         
         System.out.println(idCardValidate( "370802940221002" ));
 
     }
     
     /**功能 18位 身份证的校验
      * @param idStr
      * @return   ParseException   1001
      * @throws Exception
      * @throws ParseException
      * @throws NumberFormatException
      * @throws java.text.ParseException
      * @author wangming
      */
     public  static   String idCardValidate(String idStr)    {
         
         if  (idStr ==  null  || (  idStr.length() !=  15  && idStr.length() !=  18   )) {
             return  BaseConst.PUBLIC_RESPONSE_FAIL;
         }
         if (  idStr.length() ==  15  ){ 
             StringBuilder sb =  new  StringBuilder(); 
             sb.append(idStr.substring( 0 6 )) 
               .append( "19"
               .append(idStr.substring( 6 )); 
             try  {
                 sb.append(getVerifyCode(sb.toString()));
                 idStr = sb.toString();
             catch  (Exception e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
            
            System.out.println(sb);
         }
     
         String errorInfo =  "" ; // 记录错误信息
         //取模映射
         String[] valCodeArr = {  "1" "0" "X" "9" "8" "7" "6" "5" "4" , "3" "2"  };
         //加权
         String[] wi = {  "7" "9" "10" "5" "8" "4" "2" "1" "6" "3" "7" , "9" "10" "5" "8" "4" "2"  };
         String ai =idStr.substring( 0 17 );
         if  (ValidateUtil.isDigit(ai) ==  false ) {
             errorInfo = ExceptionConst.PAXINFO_CARD_ISNOTNUM;
             return  errorInfo;
         }
         // ================ 出生年月是否有效 ================
         String strYear = ai.substring( 6 10 ); // 年份
         String strMonth = ai.substring( 10 12 ); // 月份
         String strDay = ai.substring( 12 14 ); // 月份
         if  (DateValidate.isStrDate(ai.substring( 6 , 14 ))==  false ) {
             errorInfo = ExceptionConst.PAXINFO_CARD_BIRTHDAY_OVER;
                     //"身份证生日无效。";
             return  errorInfo;
         }
         GregorianCalendar gc =  new  GregorianCalendar();
         SimpleDateFormat s =  new  SimpleDateFormat( "yyyy-MM-dd" );
         Date limitDate=DateUtil.getIntervalDate( new  Date(),DateUtil.BEFORE,  "150Y" );
         Date dd =  null ;
         try  {
             dd = s.parse(strYear +  "-"  + strMonth +  "-"  + strDay);
         catch  (java.text.ParseException e) { //类型转换异常
             errorInfo =  "ParseException" ;
             return  errorInfo;
         }
         if  (DateValidate.isDateBefore(dd,limitDate)) {
             errorInfo = ExceptionConst.PAXINFO_CARD_BIRTHDAY_OVER;
                     //"身份证生日不在有效范围。";
             return  errorInfo;
         }
 
         // ================ 地区码是否有效 ================
         
         if  (ConfigConst.CARD_AREA_CODE.indexOf(ai.substring( 0 2 ))< 0 ) {
             errorInfo = ExceptionConst.PAXINFO_CARD_AREA_OVER;

你可能感兴趣的:(身份证号正则校验(js校验+JAVA校验))