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.
Если кто-то может пролить свет на этот вопрос, я был бы очень признателен.
Обновление: чтобы уточнить, я не хочу, чтобы текст "номер телефона" был частью результата при доступе к NSTextCheckingResult
phoneNumber
имущество.
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");
}
}];
}