NSDataDetector无法检测到无效的电话号码

时间:2014-07-11 17:32:15

标签: ios

我尝试使用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有效

1 个答案:

答案 0 :(得分:1)

我认为你假设行为NSDataDetector没有提供。

NSDataDetector并不要求可能的电话号码符合特定格式,因此它会检测具有许多长度和视觉分隔符变体的数字,例如-,因为这些数字不会影响拨打的号码。

请查看http://en.wikipedia.org/wiki/National_conventions_for_writing_telephone_numbers了解电话号码当前使用的多种方式。我想您会发现所有示例都至少在一个地区有效。根据{{​​3}},它们也都符合tel:网址的电话号码部分。

NSDataDetector检测可能是电话号码的字符串。如果您想强制执行特定格式(希望知道您在此过程中消除了有效数字),您必须自己进一步过滤这些结果。