Как проверить IP-адрес с регулярным выражением в Objective-C?

Как проверить IP-адрес в Objective-C?

4 ответа

Здесь категория, использующая современный inet_pton, который вернет YES для действительной строки IPv4 или IPv6.

#include <arpa inet.h="">
 @implementation NSString (IPValidation)
 - (BOOL)isValidIPAddress
 {
 const char *utf8 = [self UTF8String];
 int success;
 struct in_addr dst;
 success = inet_pton(AF_INET, utf8, &dst);
 if (success != 1) {
 struct in6_addr dst6;
 success = inet_pton(AF_INET6, utf8, &dst6);
 }
 return success == 1;
 }
 @end
</arpa>


Вот альтернативный подход, который также может помочь. Предположим, что у вас есть NSString*, который содержит ваш IP-адрес, называемый ipAddressStr, формата a.b.c.d:

int ipQuads[4];
const char *ipAddress = [ipAddressStr cStringUsingEncoding:NSUTF8StringEncoding];
sscanf(ipAddress, "%d.%d.%d.%d", &ipQuads[0], &ipQuads[1], &ipQuads[2], &ipQuads[3]);
@try {
 for (int quad = 0; quad < 4; quad++) {
 if ((ipQuads[quad] < 0) || (ipQuads[quad] > 255)) {
 NSException *ipException = [NSException
 exceptionWithName:@"IPNotFormattedCorrectly"
 reason:@"IP range is invalid"
 userInfo:nil];
 @throw ipException;
 }
 }
}
@catch (NSException *exc) {
 NSLog(@"ERROR: %@", [exc reason]);
}

Вы можете изменить условный блок if, чтобы следовать рекомендациям RFC 1918, если вам нужен этот уровень проверки.


Трюк, который вы можете сделать, это проверить возврат вызова BSD inet_aton следующим образом:

#include <arpa inet.h="">
- (BOOL)isIp:(NSString*)string{
 struct in_addr pin;
 int success = inet_aton([string UTF8String],&pin);
 if (success == 1) return TRUE;
 return FALSE;
}
</arpa>

Помните, однако, что это подтверждает строку, если она содержит IP-адрес в любом формате, но не ограничивается точечным форматом.


Быстрое издание:

func isIPAddressValid(ip: String) -> Bool {
 guard let utf8Str = (ip as NSString).utf8String else {
 return false
 }
 let utf8:UnsafePointer<int8> = UnsafePointer(utf8Str)
 var success: Int32
 var dst: in_addr = in_addr()
 success = inet_pton(AF_INET, utf8, &dst)
 if (success != 1) {
 var dst6: in6_addr? = in6_addr()
 success = inet_pton(AF_INET6, utf8, &dst6);
 }
 return success == 1
}
</int8>

licensed under cc by-sa 3.0 with attribution.