NSDataDetector обнаруживает текст "номер телефона"

Проще всего объяснить эту проблему с помощью примера кода и его вывода, но, по сути, происходит NSDataDetector обнаруживает номер телефона в строке, которая включает в себя слова "номер телефона".

NSError *error = nil;
NSDataDetector *dataDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber
                                                               error:&error];

NSArray *stringsToTest = @[
                           @"testing phone number 0123 4567891",
                           @"testing some other number 0123 4567892",
                           @"phone number 0123 4567893",
                           @"blah blah 0123 4567894",
                           @"testing telephone number 0123 4567895"
                           ];

for (NSString *string in stringsToTest)
{
    [dataDetector enumerateMatchesInString:string
                                   options:0
                                     range:NSMakeRange(0, string.length)
                                usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                                    NSLog(@"%@", result.phoneNumber);
                                }];
}

Выход:

2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] phone number 0123 4567891
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] 0123 4567892
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] phone number 0123 4567893
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] 0123 4567894
2013-11-24 19:04:26.001 PhoneNumberDetector[21874:70b] 0123 4567895

Я прочитал документацию и искал вокруг SO, но не могу найти ничего, что указывает, является ли это предполагаемым поведением и, если да, то почему.

Это происходит на симуляторе 7.0, а также на моем iPhone 5s с 7.0.4.

Если кто-то может пролить свет на этот вопрос, я был бы очень признателен.

Обновление: чтобы уточнить, я не хочу, чтобы текст "номер телефона" был частью результата при доступе к NSTextCheckingResultphoneNumber имущество.

1 ответ

Хотя кажется, что это ошибка в коде Apple, существует простой обходной путь, если вы хотите извлечь только число из строки, удалив нецифровые символы в блоке:

NSError *error = nil;
    NSDataDetector *dataDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber
                                                                   error:&error];

    NSArray *stringsToTest = @[
                                @"testing phone number 0123 4567891",
                                @"testing some other number 0123 4567892",
                                @"phone number 0123 4567893",
                                @"blah blah 0123 4567894",
                                @"testing telephone number 0123 4567895",
                                @"phone",
                                @"number",
                                @"my phone number 1234587985",
                                @"this string does not contain a phone number"
                               ];

    for (NSString *string in stringsToTest)
    {
        [dataDetector enumerateMatchesInString:string
                                       options:0
                                         range:NSMakeRange(0, string.length)
                                    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
                                    {
                                        NSString *numberWithExtra = result.phoneNumber;
                                        NSCharacterSet *toRemove = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
                                        NSString *trimmed = [[numberWithExtra componentsSeparatedByCharactersInSet:toRemove] componentsJoinedByString:@""];
                                        if(trimmed && trimmed.length)
                                        {
                                            NSLog(@"%@", trimmed);
                                        }
                                        else
                                        {
                                            NSLog(@"No phone number");
                                        }
                                    }];
    }
Другие вопросы по тегам