博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS身份证验证
阅读量:6412 次
发布时间:2019-06-23

本文共 5663 字,大约阅读时间需要 18 分钟。

hot3.png

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

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

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

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

头文件:

[objc]   
 
  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.  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.   
.m实现文件:
[objc]   
 
  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]   
 
  1. 原文地址:http://blog.csdn.net/yangbingbinga  

使用方法示例:

[objc]   
 
  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是不能通过的。

转载于:https://my.oschina.net/u/1244672/blog/620128

你可能感兴趣的文章
中国北方国际五金城硬件选型
查看>>
php.exe启动时提示缺少MVCR110.dall 64位 window系统 解决
查看>>
判断是否为数字方法
查看>>
[翻译] EF Core in Action 关于这本书
查看>>
js Uncaught TypeError: undefined is not a function
查看>>
数据库存储引擎
查看>>
[2019.2.13]BZOJ4318 OSU!
查看>>
版本号带两个小数点的,如何比较大小?( NSStringCompareOptions )
查看>>
QCustomplot使用分享(三) 图
查看>>
什么是java?
查看>>
WPF路径动画(动态逆向动画)
查看>>
Low Level Reader Protocol (LLRP) 简介
查看>>
[Micropython]TPYBoard v10x NRF24L01无线通讯模块使用教程
查看>>
mysql中show processlist过滤和杀死线程
查看>>
最新Sublime Text 2 激活 汉化
查看>>
基础数据类型之字典
查看>>
第七次作业
查看>>
Oracle中NVARCHAR2与VARCHAR2的区别
查看>>
php debug
查看>>
Ubuntu构建LVS+Keepalived高可用负载均衡集群【生产环境部署】
查看>>