iOS之註冊、修改密碼、忘記密碼、設定支付密碼、忘記支付密碼、修改支付密碼
#import <Foundation/Foundation.h>
@interface LYZZShareManager : NSObject
+(instancetype)sharedManager;
+(BOOL) IsIdentityCard:(NSString *)IDCardNumber;//身份證
+ (BOOL)checkUserIdCard: (NSString *)idCard ;//省份證(全)
+ (BOOL) IsPhoneNumber:(NSString *)number;//手機
+(NSString *)checkTreephoneOperate:(NSString *)phoneNum;//判斷手機三大運營商
+ (BOOL)checkPhone:(NSString *)phoneNumber;
+(BOOL)phoneAndfixtel:(NSString *)mobileNum;//手機和固話的正則
+ (BOOL) IsBankCard:(NSString *)cardNumber;//銀行卡
+ (BOOL)checkEmail:(NSString *)email;//郵箱
+(NSString*)deviceVersion;//判斷手機型號iphone4 5 6 plus
+(BOOL) deptNameInputShouldChinese:(NSString *)text;//輸入中文
+(BOOL) deptNumInputShouldNumber:(NSString
+(BOOL) deptPassInputShouldAlpha:(NSString *)text;//輸入字母
+(BOOL) deptIdInputShouldAlphaNum:(NSString *)text;//輸入字母或數字
@end
*********
#import "LYZZShareManager.h"
#import "sys/utsname.h"
@implementation LYZZShareManager
+(instancetype)sharedManager{
staticLYZZShareManager *lyZZ;
static dispatch_once_t
dispatch_once(&onceToken, ^{
lyZZ =[[LYZZShareManager alloc]init];
});
return lyZZ;
}
//身份證正則
+(BOOL) IsIdentityCard:(NSString *)IDCardNumber
{
for (int i=0; i<IDCardNumber.length; i++) {
NSString *c=[NSStringstringWithFormat:@"%c",[IDCardNumber characterAtIndex:i]];
if(![c isEqualToString:@"0"]&&![c isEqualToString:@"1"]&&![c isEqualToString:@"2"]&&![c isEqualToString:@"3"]&&![c isEqualToString:@"4"]&&![c isEqualToString:@"5"]&&![c isEqualToString:@"6"]&&![c isEqualToString:@"7"]&&![c isEqualToString:@"8"]&&![c isEqualToString:@"9"]){
return NO;
}
}
if (IDCardNumber.length <= 0) {
return NO;
}
NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
return [identityCardPredicate evaluateWithObject:IDCardNumber];
}
//手機號正則
+ (BOOL) IsPhoneNumber:(NSString *)number
{
NSString *phoneRegex1=@"1[34578]([0-9]){9}";
NSPredicate *phoneTest1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex1];
return [phoneTest1 evaluateWithObject:number];
}
//銀行卡正則
+ (BOOL) IsBankCard:(NSString *)cardNumber
{
for (int i=0; i<cardNumber.length; i++) {
NSString *c=[NSString stringWithFormat:@"%c",[cardNumber characterAtIndex:i]];
if(![c isEqualToString:@"0"]&&![c isEqualToString:@"1"]&&![c isEqualToString:@"2"]&&![c isEqualToString:@"3"]&&![c isEqualToString:@"4"]&&![c isEqualToString:@"5"]&&![c isEqualToString:@"6"]&&![c isEqualToString:@"7"]&&![c isEqualToString:@"8"]&&![c isEqualToString:@"9"]){
NSLog(@"銀行卡正則");
return NO;
}
}
if(cardNumber.length==0)
{
return NO;
}
NSString *digitsOnly = @"";
char c;
for (int i = 0; i < cardNumber.length; i++)
{
c = [cardNumber characterAtIndex:i];
if (isdigit(c))
{
digitsOnly =[digitsOnly stringByAppendingFormat:@"%c",c];
}
}
int sum = 0;
int digit = 0;
int addend = 0;
BOOL timesTwo = false;
for (NSInteger i = digitsOnly.length - 1; i >= 0; i--)
{
digit = [digitsOnly characterAtIndex:i] - '0';
if (timesTwo)
{
addend = digit * 2;
if (addend > 9) {
addend -= 9;
}
}
else {
addend = digit;
}
sum += addend;
timesTwo = !timesTwo;
}
int modulus = sum % 10;
return modulus == 0;
}
#pragma mark --判斷手機號合法性
+ (BOOL)checkPhone:(NSString *)phoneNumber
{
NSString *regex = @"^((13[0-9])|(147)|(15[^4,\\D])|(18[0-9])|(17[0-9]))\\d{8}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL isMatch = [pred evaluateWithObject:phoneNumber];
if (!isMatch)
{
return NO;
}
returnYES;
}
//手機和固話的正則
+(BOOL)phoneAndfixtel:(NSString *)mobileNum{
{
if (mobileNum.length != 11)
{
return NO;
}
/**
* 手機號碼:
* 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[6, 7, 8], 18[0-9], 170[0-9]
* 移動號段: 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705
* 聯通號段: 130,131,132,155,156,185,186,145,176,1709
* 電訊號段: 133,153,180,181,189,177,1700
*/
NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[03678])\\d{8}$";
/**
* 中國移動:China Mobile
* 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705
*/
NSString *CM = @"(^1(3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\\d{8}$)|(^1705\\d{7}$)";
/**
* 中國聯通:China Unicom
* 130,131,132,155,156,185,186,145,176,1709,175
*/
NSString *CU = @"(^1(3[0-2]|4[5]|5[56]|7[56]|8[56])\\d{8}$)|(^1709\\d{7}$)";
/**
* 中國電信:China Telecom
* 133,153,180,181,189,177,1700
*/
NSString *CT = @"(^1(33|53|77|8[019]|99)\\d{8}$)|(^1700\\d{7}$)";
/**
25 * 大陸地區固話及小靈通
26 * 區號:010,020,021,022,023,024,025,027,028,029
27 * 號碼:七位或八位
28 */
// NSString * PHS = @"^(0[0-9]{2})\\d{8}$|^(0[0-9]{3}(\\d{7,8}))$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
if (([regextestmobile evaluateWithObject:mobileNum] == YES)
|| ([regextestcm evaluateWithObject:mobileNum] == YES)
|| ([regextestct evaluateWithObject:mobileNum] == YES)
|| ([regextestcu evaluateWithObject:mobileNum] == YES))
{
return YES;
}
else
{
return NO;
}
}
}
#pragma mark 判斷郵箱
+ (BOOL)checkEmail:(NSString *)email{
//^(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w{2,3}){1,3})$
NSString *regex = @"^[a-zA-Z0-9_-][email protected][a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [emailTest evaluateWithObject:email];
}
//使用者身份證號15或18位
+ (BOOL)checkUserIdCard: (NSString *)idCard {
idCard = [idCard stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];
NSInteger length =0;
if (!idCard) {
return NO;
}else {
length = idCard.length;
//不滿足15位和18位,即身份證錯誤
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 = [idCard 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;
//分為15位、18位身份證進行校驗
switch (length) {
case 15:
//獲取年份對應的數字
year = [idCard substringWithRange:NSMakeRange(6,2)].intValue +1900;
if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {
//建立正則表示式 NSRegularExpressionCaseInsensitive:不區分字母大小寫的模式
regularExpression = [[NSRegularExpressionalloc]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 = [[NSRegularExpressionalloc]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];//測試出生日期的合法性
}
//使用正則表示式匹配字串 NSMatchingReportProgress:找到最長的匹配字串後呼叫block回撥
numberofMatch = [regularExpression numberOfMatchesInString:idCard
options:NSMatchingReportProgress
range:NSMakeRange(0, idCard.length)];
if(numberofMatch >0) {
return YES;
}else {
return NO;
}
case 18:
year = [idCard substringWithRange:NSMakeRange(6,4)].intValue;
if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {
regularExpression = [[NSRegularExpressionalloc]initWithPattern:@"^[1-9][0-9]{5}19[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:NSRegularExpressionCaseInsensitiveerror:nil];//測試出生日期的合法性
}else {
regularExpression = [[NSRegularExpressionalloc]initWithPattern:@"^[1-9][0-9]{5}19[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:NSRegularExpressionCaseInsensitiveerror:nil];//測試出生日期的合法性
}
numberofMatch = [regularExpression numberOfMatchesInString:idCard
options:NSMatchingReportProgress
range:NSMakeRange(0, idCard.length)];
if(numberofMatch >0) {
//1:校驗碼的計算方法 身份證號碼17位數分別乘以不同的係數。從第一位到第十七位的係數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。將這17位數字和係數相乘的結果相加。
int S = [idCard substringWithRange:NSMakeRange(0,1)].intValue*7 + [idCard substringWithRange:NSMakeRange(10,1)].intValue *7 + [idCard substringWithRange:NSMakeRange(1,1)].intValue*9 + [idCard substringWithRange:NSMakeRange(11,1)].intValue *9 + [idCard substringWithRange:NSMakeRange(2,1)].intValue*10 + [idCard substringWithRange:NSMakeRange(12,1)].intValue *10 + [idCard substringWithRange:NSMakeRange(3,1)].intValue*5 + [idCard substringWithRange:NSMakeRange(13,1)].intValue *5 + [idCard substringWithRange:NSMakeRange(4,1)].intValue*8 + [idCard substringWithRange:NSMakeRange(14,1)].intValue *8 + [idCard substringWithRange:NSMakeRange(5,1)].intValue*4 + [idCard substringWithRange:NSMakeRange(15,1)].intValue *4 + [idCard substringWithRange:NSMakeRange(6,1)].intValue*2 + [idCard substringWithRange:NSMakeRange(16,1)].intValue *2 + [idCard substringWithRange:NSMakeRange(7,1)].intValue *1 + [idCard substringWithRange:NSMakeRange(8,1)].intValue *6 + [idCard substringWithRange:NSMakeRange(9,1)].intValue *3;
//2:用加出來和除以11,看餘數是多少?餘數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字
int Y = S %11;
NSString *M =@"F";
NSString *JYM =@"10X98765432";