#pragma mark - 身份證的正則表達式
+(BOOL)checkUserID:(NSString *)userID
{
??? //長度不為18的都排除掉
??? if (userID.length!=18) {
??????? return NO;
??? }
?? ?
??? //校驗格式
??? NSString *regex2 = @"^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$";
??? NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
??? BOOL flag = [identityCardPredicate evaluateWithObject:userID];
?? ?
??? if (!flag) {
??????? return flag;??? //格式錯誤
??? }else {
??????? //格式正確在判斷是否合法
?????? ?
??????? //將前17位加權因子保存在數組里
??????? NSArray * idCardWiArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];
?????? ?
??????? //這是除以11后,可能產生的11位余數、驗證碼,也保存成數組
??????? NSArray * idCardYArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
?????? ?
??????? //用來保存前17位各自乖以加權因子后的總和
??????? NSInteger idCardWiSum = 0;
??????? for(int i = 0;i < 17;i++)
??????? {
??????????? NSInteger subStrIndex = [[userID substringWithRange:NSMakeRange(i, 1)] integerValue];
??????????? NSInteger idCardWiIndex = [[idCardWiArray objectAtIndex:i] integerValue];
?????????? ?
??????????? idCardWiSum+= subStrIndex * idCardWiIndex;
?????????? ?
??????? }
?????? ?
??????? //計算出校驗碼所在數組的位置
??????? NSInteger idCardMod=idCardWiSum%11;
?????? ?
??????? //得到最后一位身份證號碼
??????? NSString * idCardLast= [userID substringWithRange:NSMakeRange(17, 1)];
?????? ?
??????? //如果等于2,則說明校驗碼是10,身份證號碼最后一位應該是X
??????? if(idCardMod==2)
??????? {
??????????? if([idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"])
??????????? {
??????????????? return YES;
??????????? }else
??????????? {
??????????????? return NO;
??????????? }
??????? }else{
??????????? //用計算出的驗證碼與最后一位身份證號碼匹配,如果一致,說明通過,否則是無效的身份證號碼
??????????? if([idCardLast isEqualToString: [idCardYArray objectAtIndex:idCardMod]])
??????????? {
??????????????? return YES;
??????????? }
??????????? else
??????????? {
??????????????? return NO;
??????????? }
??????? }
??? }
}