我尝试使用NSDataDetector来验证电话号码。它似乎没有工作,这可能意味着我错误地使用它,但我无法弄清楚如何。下面代码中的所有这些电话号码都应该失败,第一个是全零,其余的是其中一个部分有太多数字。但他们都在通过验证。我不是100%肯定它是否应该验证字符串的内容,所以第一个传递可能是可以接受的,但其余的绝对不是。我做错了什么?
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSArray *phoneNumbers = @[@"000-000-0000", @"1234-567-8901", @"123-4567-8901", @"123-456-78901"];
for (NSString *phoneNumber in phoneNumbers)
{
if ([self phoneNumberIsValid:phoneNumber])
{
NSLog(@"%@ is valid", phoneNumber);
} else
{
NSLog(@"%@ is not valid", phoneNumber);
}
}
}
- (BOOL)phoneNumberIsValid:(NSString *)phoneNumber
{
BOOL returnValue = NO;
NSError *error = nil;
NSDataDetector *dataDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber error:&error];
NSRange phoneRange = NSMakeRange(0, [phoneNumber length]);
NSArray *matches = [dataDetector matchesInString:phoneNumber options:0 range:phoneRange];
if (!error && [matches count] > 0)
{
NSTextCheckingResult *result = (NSTextCheckingResult *)[matches firstObject];
NSLog(@"found number: %@", result.phoneNumber);
if ([result resultType] == NSTextCheckingTypePhoneNumber && NSEqualRanges(result.range, phoneRange)) {
returnValue = YES;
}
}
return returnValue;
}
输出:
2014-07-11 10:27:15.520 PhoneValidationTest [90146:60b]发现号码:000-000-0000 2014-07-11 10:27:15.522 PhoneValidationTest [90146:60b] 000-000-0000有效 2014-07-11 10:27:15.540 PhoneValidationTest [90146:60b]发现电话号码:1234-567-8901 2014-07-11 10:27:15.540 PhoneValidationTest [90146:60b] 1234-567-8901有效 2014-07-11 10:27:15.542 PhoneValidationTest [90146:60b]发现电话号码:123-4567-8901 2014-07-11 10:27:15.542 PhoneValidationTest [90146:60b] 123-4567-8901有效 2014-07-11 10:27:15.544 PhoneValidationTest [90146:60b]发现电话号码:123-456-78901 2014-07-11 10:27:15.544 PhoneValidationTest [90146:60b] 123-456-78901有效
答案 0 :(得分:1)
我认为你假设行为NSDataDetector
没有提供。
NSDataDetector
并不要求可能的电话号码符合特定格式,因此它会检测具有许多长度和视觉分隔符变体的数字,例如-
,因为这些数字不会影响拨打的号码。
请查看http://en.wikipedia.org/wiki/National_conventions_for_writing_telephone_numbers了解电话号码当前使用的多种方式。我想您会发现所有示例都至少在一个地区有效。根据{{3}},它们也都符合tel:
网址的电话号码部分。
NSDataDetector
检测可能是电话号码的字符串。如果您想强制执行特定格式(希望知道您在此过程中消除了有效数字),您必须自己进一步过滤这些结果。