一直在用正则式判断电话号码是否合法,然而我还不很会写正则式,后来发现了这样一个类——NSDataDetector。在昨天之前我都不知道这是个啥,实际用了一下,可以用,但有些不足。
+ (nullable NSDataDetector *)dataDetectorWithTypes:(NSTextCheckingTypes)checkingTypes error:(NSError **)error;
- (nullable instancetype)initWithTypes:(NSTextCheckingTypes)checkingTypes error:(NSError **)error NS_DESIGNATED_INITIALIZER;
实际用法就贴一下代码吧,直接粘贴就可以
NSError *error = nil;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber | NSTextCheckingTypeLink
error:&error];
NSString *testStr = @"有一个网址:www.balabala.com有一个电话:13567827891"; // 网址电话是随意写的
[detector enumerateMatchesInString:testStr
options:kNilOptions
range:NSMakeRange(0, testStr.length)
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
//NSTextCheckingResult有很多属性,和检测的类型相匹配,如URL,phoneNumber,date,addressComponents等等
//NSTextCheckingResult还有Range 和 NSTextCheckingType两个属性,方便进行操作
NSLog(@"result.range = %@",NSStringFromRange(result.range));
if (result.URL) {
NSLog(@"url = %@",result.URL);
}
if (result.phoneNumber) {
NSLog(@"phone = %@",result.phoneNumber);
}
}];
但是我发现,只要数字连续5位及以上,就会判断为电话号码,比如写个“33333”。所以和实际需求好像还是有些出入,如果要求不是很高的话,就可以省去写正则表达式的麻烦了。
对于判断URL,Date, AddressConponents等,这些类的合法性还是可以用的,毕竟我们也没有什么好方法。
可以结合我之前写的一篇UIlabel各种字体各种颜色拼接来实现Label,textView等的高亮显示。