iOS身份证验证

在项目中,我们在验证用户的输入,最简单的方法就是使用正则表达式了,ios系统也提供很方便的方法,让我们可以轻松的来验证用户名,密码,身份证好 ,手机号等;

下面附上我在项目中用到的正则表达式的验证方法,

由于比较常用,大家最好封装成+静态的方法,便于使用:

我把常用的方法,使用静态方法封装到一个 Utils类里面,直接使用类名调用即可:

头文件:

[objc]  view plain  copy
 print ?
  1. //  
  2. //  Utils.h  
  3. //  AutoSizing  
  4. //  
  5. //  Created by  on 15/2/7.  
  6. //  Copyright (c) 2015年 http://blog.csdn.net/yangbingbinga. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. @interface  Utils : NSObject  
  12. #pragma 正则匹配手机号  
  13. + (BOOL)checkTelNumber:(NSString *) telNumber;  
  14. #pragma 正则匹配用户密码6-18位数字和字母组合  
  15. + (BOOL)checkPassword:(NSString *) password;  
  16. #pragma 正则匹配用户姓名,20位的中文或英文  
  17. + (BOOL)checkUserName : (NSString *) userName;  
  18. #pragma 正则匹配用户身份证号  
  19. + (BOOL)checkUserIdCard: (NSString *) idCard;  
  20. #pragma 正则匹员工号,12位的数字  
  21. + (BOOL)checkEmployeeNumber : (NSString *) number;  
  22. #pragma 正则匹配URL  
  23. + (BOOL)checkURL : (NSString *) url;  
  24. @end   
.m实现文件:
[objc]  view plain  copy
 print ?
  1. //  
  2. //  Utils.m  
  3. //  AutoSizing  
  4. //  
  5. //  Created by  on 15/2/7.  
  6. //  Copyright (c) 2015年 http://blog.csdn.net/yangbingbinga. All rights reserved.  
  7. //  
  8.   
  9. #import "Utils.h"  
  10.   
  11. @implementation Utils  
  12. #pragma 正则匹配手机号  
  13. + (BOOL)checkTelNumber:(NSString *) telNumber  
  14. {  
  15.     NSString *pattern = @"^1+[3578]+\\d{9}";  
  16.     NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];  
  17.     BOOL isMatch = [pred evaluateWithObject:telNumber];  
  18.     return isMatch;  
  19. }  
  20.   
  21.   
  22. #pragma 正则匹配用户密码6-18位数字和字母组合  
  23. + (BOOL)checkPassword:(NSString *) password  
  24. {  
  25.     NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}";  
  26.     NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];  
  27.     BOOL isMatch = [pred evaluateWithObject:password];  
  28.     return isMatch;  
  29.       
  30. }  
  31.   
  32. #pragma 正则匹配用户姓名,20位的中文或英文  
  33. + (BOOL)checkUserName : (NSString *) userName  
  34. {  
  35.     NSString *pattern = @"^[a-zA-Z\u4E00-\u9FA5]{1,20}";  
  36.     NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];  
  37.     BOOL isMatch = [pred evaluateWithObject:userName];  
  38.     return isMatch;  
  39.       
  40. }  
  41.   
  42.   
  43. #pragma 正则匹配用户身份证号15或18位  
  44. + (BOOL)checkUserIdCard: (NSString *) idCard  
  45. {  
  46.     NSString *pattern = @"(^[0-9]{15}$)|([0-9]{17}([0-9]|X)$)";  
  47.     NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];  
  48.     BOOL isMatch = [pred evaluateWithObject:idCard];  
  49.     return isMatch;  
  50. }  
  51.   
  52. #pragma 正则匹员工号,12位的数字  
  53. + (BOOL)checkEmployeeNumber : (NSString *) number  
  54. {  
  55.     NSString *pattern = @"^[0-9]{12}";  
  56.       
  57.     NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];  
  58.     BOOL isMatch = [pred evaluateWithObject:number];  
  59.     return isMatch;  
  60.       
  61. }  
  62.   
  63. #pragma 正则匹配URL  
  64. + (BOOL)checkURL : (NSString *) url  
  65. {  
  66.     NSString *pattern = @"^[0-9A-Za-z]{1,50}";  
  67.     NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];  
  68.     BOOL isMatch = [pred evaluateWithObject:url];  
  69.     return isMatch;  
  70.       
  71. }  
  72.   
  73. @end  


[objc]  view plain  copy
 print ?
  1. 原文地址:http://blog.csdn.net/yangbingbinga  


使用方法示例:

[objc]  view plain  copy
 print ?
  1. if ([Utils checkTelNumber:@"18801112020"])  //匹配结果,为YES  
  2. {  
  3.     NSLog(@"手机号格式正确");  
  4. }  
  5. else                                        //匹配结果为NO  
  6. {  
  7.     NSLog(@"手机号格式错误");  
  8. }  

返回一个布尔值,根据布尔值,我们可以做相应的操作


扩展NSString代码

扩展NSString,添加以下方法:

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
 
- ( BOOL ) hyb _ isValidPersonID {
   return [ NSString hyb_isValidPersonID :self ] ;
}
 
+ ( BOOL ) hyb_isValidPersonID : ( NSString * ) personId {
   // 判断位数
   if ( personId . length != 15 && personId . length != 18 ) {
     return NO ;
   }
   NSString *carid = personId ;
   long lSumQT = 0 ;
   // 加权因子
   int R [ ] = { 7 , 9 , 10 , 5 , 8 , 4 , 2 , 1 , 6 , 3 , 7 , 9 , 10 , 5 , 8 , 4 , 2 } ;
   // 校验码
   unsigned char checkers [ 11 ] = { '1' , '0' , 'X' , '9' , '8' , '7' , '6' , '5' , '4' , '3' , '2' } ;
  
   // 将15位身份证号转换成18位
   NSMutableString *str = [ NSMutableString stringWithString :personId ] ;
   if ( personId . length == 15 ) {
     [ str insertString : @"19" atIndex : 6 ] ;
     long p = 0 ;
     const char *personId = [ str UTF8String ] ;
    
     for ( int i = 0 ; i <= 16 ; i ++ ) {
       p += ( personId [ i ] - 48 ) * R [ i ] ;
     }
    
     int o = p % 11 ;
     NSString *string_content = [ NSString stringWithFormat : @"%c" , checkers [ o ] ] ;
     [ str insertString :string_content atIndex : [ str length ] ] ;
     carid = str ;
   }
  
   // 判断地区码
   NSString * sProvince = [ carid substringToIndex : 2 ] ;
   if ( ! [ self _areaCode :sProvince ] ) {
     return NO ;
   }
  
   // 判断年月日是否有效
   // 年份
   int strYear = [ [ self _substringWithString :carid begin : 6 end : 4 ] intValue ] ;
   // 月份
   int strMonth = [ [ self _substringWithString :carid begin : 10 end : 2 ] intValue ] ;
   // 日
   int strDay = [ [ self _substringWithString :carid begin : 12 end : 2 ] intValue ] ;
  
   NSTimeZone *localZone = [ NSTimeZone localTimeZone ] ;
   NSDateFormatter *dateFormatter = [ [ NSDateFormatter alloc ] init ] ;
   [ dateFormatter setDateStyle :NSDateFormatterMediumStyle ] ;
   [ dateFormatter setTimeStyle :NSDateFormatterNoStyle ] ;
   [ dateFormatter setTimeZone :localZone ] ;
   [ dateFormatter setDateFormat : @"yyyy-MM-dd HH:mm:ss" ] ;
   NSDate *date = [ dateFormatter dateFrostr : [ NSString stringWithFormat : @"%d-%d-%d 12:01:01" ,
                                               strYear , strMonth , strDay ] ] ;
   if ( date == nil ) {
     return NO ;
   }
  
   const char *pid    = [ carid UTF8String ] ;
   // 检验长度
   if ( 18 != strlen ( pid ) ) return NO ;
   // 校验数字
   for ( int i = 0 ; i < 18 ; i ++ ) {
     if ( ! isdigit ( pid [ i ] ) && ! ( ( 'X' == pid [ i ] || 'x' == pid [ i ] ) && 17 == i ) ) {
       return NO ;
     }
   }
  
   // 验证最末的校验码
   for ( int i = 0 ; i <= 16 ; i ++ ) {
     lSumQT += ( pid [ i ] - 48 ) * R [ i ] ;
   }
  
   if ( checkers [ lSumQT % 11 ] != pid [ 17 ] ) {
     return NO ;
   }
   return YES ;
}
 
 
#pragma mark - Private
+ ( NSString * ) _substringWithString : ( NSString * ) str begin : ( NSInteger ) begin end : ( NSInteger ) end {
   return [ str substringWithRange :NSMakeRange ( begin , end ) ] ;
}
 

温馨提示

这段代码是严格地验证15位和18位的身份证的,并且x/X是不同的,x是不能通过的。


你可能感兴趣的:(身份证正则)