iOS各种验证

#import <Foundation/Foundation.h>
 
typedef enum
{
     IdentifierTypeKnown = 0,
     IdentifierTypeZipCode,      //1
     IdentifierTypeEmail,        //2
     IdentifierTypePhone,        //3
     IdentifierTypeUnicomPhone,  //4   
     IdentifierTypeQQ,           //5
     IdentifierTypeNumber,       //6
     IdentifierTypeString,       //7
     IdentifierTypeIdentifier,   //8
     IdentifierTypePassort,      //9
     IdentifierTypeCreditNumber, //10
     IdentifierTypeBirthday,     //11
}IdentifierType;
 
@interface IdentifierValidator : NSObject
{
}
 
+ ( BOOL ) isValid:(IdentifierType) type value:(NSString*) value;
 
@end
 
#import "IdentifierValidator.h"
#import "NSString+ITTAdditions.h"
 
int getIndex ( char ch);
BOOL isNumber ( char ch);
 
int getIndex ( char ch) {
     if ((ch >= '0' && ch <= '9' )||(ch >= 'a' && ch <= 'z' )||
         (ch >= 'A' && ch <= 'Z' )|| ch == '_' ) {
         return 0;
     }
     if (ch == '@' ) {
         return 1;
     }
     if (ch == '.' ) {
         return 2;
     }
     return -1;
}
 
BOOL isNumber ( char ch)
{
     if (!(ch >= '0' && ch <= '9' )) {
         return FALSE;
     }
     return TRUE;
}
@implementation IdentifierValidator
 
+ ( BOOL ) isValidZipcode:(NSString*)value
{
     const char *cvalue = [value UTF8String];
     int len = strlen (cvalue);
     if (len != 6) {
         return FALSE;
     }
     for ( int i = 0; i < len; i++)
     {
         if (!(cvalue[i] >= '0' && cvalue[i] <= '9' ))
         {
             return FALSE;
         }
     }
     return TRUE;
}
 
+ ( BOOL ) validateEmail:(NSString *)candidate
{
     NSArray *array = [candidate componentsSeparatedByString:@ "." ];
     if ([array count] >= 4) {
         return FALSE;
     }
     NSString *emailRegex = @ "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}" ;
     NSPredicate *emailTest = [NSPredicate predicateWithFormat:@ "SELF MATCHES %@" , emailRegex];
     return [emailTest evaluateWithObject:candidate];
}
 
+ ( BOOL ) isValidEmail:(NSString*)value {
     static int state[5][3] = {
         {1, -1, -1},
         {1,  2, -1},
         {3, -1, -1},
         {3, -1, 4},
         {4, -1, -1}
     };
     BOOL valid = TRUE;
     const char *cvalue = [value UTF8String];
     int currentState = 0;
     int len = strlen (cvalue);
     int index;
     for ( int i = 0; i < len && valid; i++) {
         index = getIndex(cvalue[i]);
         if (index < 0) {
             valid = FALSE;
         }
         else {
             currentState = state[currentState][index];
             if (currentState < 0) {
                 valid = FALSE;
             }
         }
     }
     //end state is invalid
     if (currentState != 4) {
         valid = FALSE;
     }
     return valid;
}
 
+ ( BOOL ) isValidNumber:(NSString*)value{
     const char *cvalue = [value UTF8String];
     int len = strlen (cvalue);
     for ( int i = 0; i < len; i++) {
         if (!isNumber(cvalue[i])){
             return FALSE;
         }
     }
     return TRUE;
}
 
+ ( BOOL ) isValidPhone:(NSString*)value {
     const char *cvalue = [value UTF8String];
     int len = strlen (cvalue);
     if (len != 11) {
         return FALSE;
     }
     if (![IdentifierValidator isValidNumber:value])
     {
         return FALSE;
     }
     NSString *preString = [[NSString stringWithFormat:@ "%@" ,value] substringToIndex:2];   
     if ([preString isEqualToString:@ "13" ] ||
         [preString isEqualToString: @ "15" ] ||
         [preString isEqualToString: @ "18" ])
     {
         return TRUE;
     }
     else
     {
         return FALSE;
     }
     return TRUE;
}
+ ( BOOL ) isValidString:(NSString*)value
{
     return value && [value length];
}
const int factor[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; //加权因子
const int checktable[] = { 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 }; //校验值对应表
+ ( BOOL ) isValidIdentifier:(NSString*)value
{
     const int LENGTH = 18;   
     const char *str = [[value lowercaseString] UTF8String];
     NSInteger i;   
     NSInteger length = strlen (str);
     BOOL result = TRUE;   
     /*
      * identifier length is invalid
      */
     if (15 != length && LENGTH != length)
     {
         result = FALSE;
     }
     else
     {
         for (i = 1; i < length - 1; i++)
         {
             if (!(str[i] >= '0' && str[i] <= '9' ))
             {
                 result = FALSE;
                 break ;
             }
         }
         if (result)
         {
             if (LENGTH == length)
             {
                 if (!((str[i] >= '0' && str[i] <= '9' )||str[i] == 'X' ||str[i] == 'x' ))
                 {
                     result = FALSE;
                 }
             }
         }
         /*
          * check sum for second generation identifier
          */
         if (result && length == LENGTH)
         {
             int i;
             int *ids = malloc ( sizeof ( int )*LENGTH);
             for (i = 0; i < LENGTH; i++)
             {
                 ids[i] = str[i] - 48;            
             }
             int checksum = 0;
             for (i = 0; i < LENGTH - 1; i ++ )
             {
                 checksum += ids[i] * factor[i];
             }
             if (ids[17] == checktable[checksum%11]||
                 (str[17] == 'x' && checktable[checksum % 11] == 10)) 
             {
                 result  = TRUE;
             }
             else
             {
                 result  = FALSE;           
             }
             free (ids);
             ids = NULL;
         }       
     }
     return result;
}
+ ( BOOL ) isValidPassport:(NSString*)value
{
     const char *str = [value UTF8String];
     char first = str[0];
     NSInteger length = strlen (str);
     if (!(first == 'P' || first == 'G' ))
     {
         return FALSE;
     }
     if (first == 'P' )
     {
         if (length != 8)
         {
             return FALSE;
         }
     }
     if (first == 'G' )
     {
         if (length != 9)
         {
             return FALSE;
         }
     }
     BOOL result = TRUE;
     for (NSInteger i = 1; i < length; i++)
     {
         if (!(str[i] >= '0' && str[i] <= '9' ))
         {
             result = FALSE;
             break ;
         }
     }       
     return result;
}
/*
  * 常用信用卡卡号规则
  * Issuer Identifier  Card Number                            Length
  * Diner's Club       300xxx-305xxx, 3095xx, 36xxxx, 38xxxx  14
  * American Express   34xxxx, 37xxxx                         15
  * VISA               4xxxxx                                 13, 16
  * MasterCard         51xxxx-55xxxx                          16
  * JCB                3528xx-358xxx                          16
  * Discover           6011xx                                 16
  * 银联                622126-622925                          16
  *
  * 信用卡号验证基本算法:
  * 偶数位卡号奇数位上数字*2,奇数位卡号偶数位上数字*2。
  * 大于10的位数减9。
  * 全部数字加起来。
  * 结果不是10的倍数的卡号非法。
  * prefrences link:http://www.truevue.org/licai/credit-card-no
  *
  */
+ ( BOOL ) isValidCreditNumber:(NSString*)value
{
     BOOL result = TRUE;
     NSInteger length = [value length];   
     if (length >= 13)
     {
         result = [IdentifierValidator isValidNumber:value];   
         if (result)
         {
             NSInteger twoDigitBeginValue = [[value substringWithRange:NSMakeRange(0, 2)] integerValue];
             NSInteger threeDigitBeginValue = [[value substringWithRange:NSMakeRange(0, 3)] integerValue];       
             NSInteger fourDigitBeginValue = [[value substringWithRange:NSMakeRange(0, 4)] integerValue];       
             //Diner's Club
             if (((threeDigitBeginValue >= 300 && threeDigitBeginValue <= 305)||
                  fourDigitBeginValue == 3095||twoDigitBeginValue==36||twoDigitBeginValue==38) && (14 != length))
             {
                 result = FALSE;
             }
             //VISA
             else if ([value isStartWithString:@ "4" ] && !(13 == length||16 == length))
             {
                 result = FALSE;
             }
             //MasterCard
             else if ((twoDigitBeginValue >= 51||twoDigitBeginValue <= 55) && (16 != length))
             {
                 result = FALSE;
             }       
             //American Express
             else if (([value isStartWithString:@ "34" ]||[value isStartWithString:@ "37" ]) && (15 != length))
             {
                 result = FALSE;
            
             //Discover
             else if ([value isStartWithString:@ "6011" ] && (16 != length))
             {
                 result = FALSE;
             }         
             else
             {
                 NSInteger begin = [[value substringWithRange:NSMakeRange(0, 6)] integerValue];
                 //CUP
                 if ((begin >= 622126 && begin <= 622925) && (16 != length))
                 {
                     result = FALSE;               
                 }
                 //other
                 else
                 {
                     result = TRUE;
                 }
             }
         }
         if (result)
         {
             NSInteger digitValue;
             NSInteger checkSum = 0;
             NSInteger index = 0;
             NSInteger leftIndex;
             //even length, odd index
             if (0 == length%2)
             {
                 index = 0;
                 leftIndex = 1;
             }
             //odd length, even index        
             else
             {
                 index = 1; 
                 leftIndex = 0;
             }
             while (index < length)
             {
                 digitValue = [[value substringWithRange:NSMakeRange(index, 1)] integerValue];           
                 digitValue = digitValue*2;
                 if (digitValue >= 10)
                 {
                     checkSum += digitValue/10 + digitValue%10;
                 }
                 else
                 {
                     checkSum += digitValue;
                 }
                 digitValue = [[value substringWithRange:NSMakeRange(leftIndex, 1)] integerValue];                       
                 checkSum += digitValue;   
                 index += 2;
                 leftIndex += 2;           
             }
             result = (0 == checkSum%10) ? TRUE:FALSE;
         }       
     }
     else
     {
         result = FALSE;
     }
     return result;
}
+ ( BOOL ) isValidBirthday:(NSString*)birthday
{
     BOOL result = FALSE;
     if (birthday && 8 == [birthday length])
     {
         NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
         [formatter setDateFormat:@ "yyyyMMdd" ];
         NSDate *date = [formatter dateFromString:birthday];
         [formatter release];
         if (date)
         {
             result = TRUE;
         }
     }
     return result;
}
+ ( BOOL ) isChinaUnicomPhoneNumber:(NSString*) phonenumber
{
     /**
      * 手机号码
      * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
      * 联通:130,131,132,152,155,156,185,186
      * 电信:133,1349,153,180,189
      */
//    NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
     /**
      10         * 中国移动:China Mobile
      11         * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
      12         */
//    NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
//    /**
//     15         * 中国联通:China Unicom
//     16         * 130,131,132,152,155,156,185,186
//     17         */
     NSString * CU = @ "^1(3[0-2]|5[256]|8[56])\\d{8}$" ;
//    /**
//     20         * 中国电信:China Telecom
//     21         * 133,1349,153,180,189
//     22         */
//    NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
//    /**
//     25         * 大陆地区固话及小灵通
//     26         * 区号:010,020,021,022,023,024,025,027,028,029
//     27         * 号码:七位或八位
//     28         */
//    NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
//    NSString * PHS1 = @"^0(10|2[0-5789]|\\d{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];
//    NSPredicate *regextestphs = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", PHS];
//    NSPredicate *regextestphs1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", PHS1];
 
     if ( //([regextestmobile evaluateWithObject:phonenumber] == YES)||
//        ([regextestcm evaluateWithObject:phonenumber] == YES)||
//        ([regextestct evaluateWithObject:phonenumber] == YES)||
           ([regextestcu evaluateWithObject:phonenumber] == YES)
//        || ([regextestphs evaluateWithObject:phonenumber] == YES)
//        || ([regextestphs1 evaluateWithObject:phonenumber] == YES)
         )
     {
         return YES;
     }
     else
     {
         return NO;
     }
}
 
+ ( BOOL ) isValid:(IdentifierType) type value:(NSString*) value
{
     if (!value ||[[value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] isEqualToString:@ "" ]) {       
         return FALSE;
     }
     BOOL result = TRUE;
     switch (type)
     {
         case IdentifierTypeZipCode:
             result = [IdentifierValidator isValidZipcode:value];
             break ;
         case IdentifierTypeEmail:
//            result = [IdentifierValidator isValidEmail:value];
             result = [IdentifierValidator validateEmail:value];
             break ;
         case IdentifierTypePhone:
             result = [IdentifierValidator isValidPhone:value];
             break ;
         case IdentifierTypeUnicomPhone:
             result = [IdentifierValidator isChinaUnicomPhoneNumber:value];
             break ;
         case IdentifierTypeQQ:
             result = [IdentifierValidator isValidNumber:value];
             break ;
         case IdentifierTypeNumber:
             result = [IdentifierValidator isValidNumber:value];
             break ;          
         case IdentifierTypeString:
             result = [IdentifierValidator isValidString:value];
             break ;
         case IdentifierTypeIdentifier:
             result = [IdentifierValidator isValidIdentifier:value];           
             break ;
         case IdentifierTypePassort:
             result = [IdentifierValidator isValidPassport:value];           
             break ;           
         case IdentifierTypeCreditNumber:
             result = [IdentifierValidator isValidCreditNumber:value];
             break ;
         case IdentifierTypeBirthday:
             result = [IdentifierValidator isValidBirthday:value];           
             break ;
         default :
             break ;
     }
     return result;
}
- ( void ) dealloc
{
     [super dealloc];
}
@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值