前言
最近在一个二次开发的项目中看到了一段身份证验证的OC代码,虽然我一直讨厌二次开发。因为这这个二次开发的项目太老,代码太乱,毫无层次感。可是令人欣慰的是,我在里面发现了一段有用的代码,感兴趣的可以参考学习。
直接上代码
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
|
- ( BOOL )isValidIdCardNum { NSString *value = [self copy]; value = [value stringByReplacingOccurrencesOfString:@ "X" withString:@ "x" ]; value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; int length = 0; if (!value) { return NO; } else { length = ( int )value.length; if (length != 15 && length !=18) { return NO; } } // 省份代码 NSArray *areasArray =@[@ "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" ]; NSString *valueStart2 = [value substringToIndex:2]; BOOL areaFlag = NO; for (NSString *areaCode in areasArray) { if ([areaCode isEqualToString:valueStart2]) { areaFlag = YES; break ; } } if (!areaFlag) { return NO; } NSRegularExpression *regularExpression; NSUInteger numberofMatch; int year = 0; switch (length) { case 15: year = [value substringWithRange:NSMakeRange(6,2)].intValue +1900; if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) { regularExpression = [[NSRegularExpression alloc] initWithPattern:@ "^[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}$" options:NSRegularExpressionCaseInsensitive error:nil]; // 测试出生日期的合法性 } else { regularExpression = [[NSRegularExpression alloc] initWithPattern:@ "^[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}$" options:NSRegularExpressionCaseInsensitive error:nil]; // 测试出生日期的合法性 } numberofMatch = [regularExpression numberOfMatchesInString:value options:NSMatchingReportProgress range:NSMakeRange(0, value.length)]; if (numberofMatch > 0) { return YES; } else { return NO; } case 18: year = [value substringWithRange:NSMakeRange(6,4)].intValue; if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) { regularExpression = [[NSRegularExpression alloc] initWithPattern:@ "^[1-9][0-9]{5}19|20[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]$" options:NSRegularExpressionCaseInsensitive error:nil]; // 测试出生日期的合法性 } else { regularExpression = [[NSRegularExpression alloc] initWithPattern:@ "^[1-9][0-9]{5}19|20[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]$" options:NSRegularExpressionCaseInsensitive error:nil]; // 测试出生日期的合法性 } numberofMatch = [regularExpression numberOfMatchesInString:value options:NSMatchingReportProgress range:NSMakeRange(0, value.length)]; if (numberofMatch > 0) { int S = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *2 + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6 + [value substringWithRange:NSMakeRange(9,1)].intValue *3; int Y = S % 11; NSString *M = @ "F" ; NSString *JYM = @ "10X98765432" ; M = [JYM substringWithRange:NSMakeRange(Y,1)]; // 判断校验位 if ([M isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]]) { return YES; // 检测ID的校验位 } else { return NO; } } else { return NO; } default : return NO; } return NO; } |
上面的代码验证十分全面。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。