IP字符串合法性验证

231 阅读1分钟

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //    @"168.0.0.1"
    
    NSLog(@"--------This is right--------");
    [self printResultOfRightIp:@"168.0.0.1"];
    
    NSLog(@"--------following are wrong--------");
    [self printResultOfRightIp:nil];
    [self printResultOfRightIp:(NSString *)@1];
    [self printResultOfRightIp:@"asdfjksal"];
    [self printResultOfRightIp:@"168。0。0。1"];
    [self printResultOfRightIp:@"168.001"];
    [self printResultOfRightIp:@"168.0.0.1.1.1.1.1"];
    [self printResultOfRightIp:@"我.999.0.1"];
    [self printResultOfRightIp:@"1.999.0.1"];
    [self printResultOfRightIp:@"0.999.0.1"];
    [self printResultOfRightIp:@"9999999.999.0.1"];
    [self printResultOfRightIp:@".1.1.1"];
    [self printResultOfRightIp:@"^&^.&*&.(.*&*"];
    [self printResultOfRightIp:@"a.b.c.d"];
    [self printResultOfRightIp:@"1.b.c.d"];
    [self printResultOfRightIp:@"1.😃.c.d"];
    [self printResultOfRightIp:@"1.の.c.d"];
    [self printResultOfRightIp:@"1.////.c.d"];
    [self printResultOfRightIp:@"1.().c.d"];
    [self printResultOfRightIp:@"001.002.03.14"];
    
    
}

- (void)printResultOfRightIp:(NSString *)ipAddress {
    NSLog(@"%@ : %@", [self testIP:ipAddress] ? @"YES" : @"NO ", ipAddress);
}

- (BOOL)testIP:(NSString *)ipAddress {
    
    if (nil == ipAddress)
        RETURN_NO;
    
    if (![ipAddress isKindOfClass:[NSString class]])
        RETURN_NO;
    {
        
        
        NSArray *units = [ipAddress componentsSeparatedByString:@"."];
        
        if (units.count != 4)
            RETURN_NO;
        
        for (int i = 0; i < units.count; i++) {
            
            NSString *subIp = units[i];
            NSString *pattern = @"[0-9]{0,3}";
            NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",pattern];
            if (![pred evaluateWithObject:subIp])
                RETURN_NO;
            
            int subIp_int = subIp.intValue;
            
            if (subIp_int < 0 || subIp_int > 255)
                RETURN_NO;
            
            if (i == 0 && subIp_int < 1)
                RETURN_NO;
            
            if (![@(subIp_int).stringValue isEqualToString:subIp])
                RETURN_NO;
        }
    }
    
    
    return YES;
}

全部用正则有几个问题待解决:

  1. 无法确定每段的数值范围

  2. 无法排除0占位的情况