NSDataDetector с NSTextCheckingTypeLink обнаруживает URL и номера телефонов! - PullRequest
7 голосов
/ 11 мая 2011

Я пытаюсь получить URL из простого предложения NSString.Для этого я использую NSDataDetector в следующем коде:

NSString *string = @"This is a sample of a http://abc.com/efg.php?EFAei687e3EsA sentence with a URL within it and a number 097843."; 
NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil]; 
NSArray *matches = [linkDetector matchesInString:string options:0 range:NSMakeRange(0, [string length])];

for (NSTextCheckingResult *match in matches) {

  if ([match resultType] == NSTextCheckingTypeLink) {
    NSString *matchingString = [match description];
    NSLog(@"found URL: %@", matchingString);
  }
}

В результате он находит URL-адрес и номер.Номер определяется как номер телефона:

found URL: http://abc.com/efg.php?EFAei687e3EsA
found URL: tel:097843

Это ошибка?Может кто-нибудь сказать мне, как получить URL без этого номера телефона?

1 Ответ

12 голосов
/ 11 мая 2011

NSDataDetector обязательно определяет телефонные номера как ссылки, потому что на телефоне вы можете нажать их, как если бы они были ссылкой, чтобы инициировать телефонный звонок (или нажать и удерживать, чтобы инициировать текстовое сообщение и т. Д.).Я считаю, что текущая локаль (то есть NSLocale) - это то, что определяет, будет ли строка чисел похожа на номер телефона или нет.Например, в Соединенных Штатах для распознавания телефонного номера потребуется не менее семи цифр, поскольку номера в США имеют общую форму: \d{3}-\d{4}.

Что касается распознавания телефонной линииПо сравнению с другой ссылкой, не стоит проверять наличие http:// в начале URL.Достаточно простого примера: что, если это ссылка https://?Тогда ваш код ломается.

Лучший способ проверить это было бы так:

NSArray *matches = [linkDetector matchesInString:string options:0 range:NSMakeRange(0, [string length])];

for (NSTextCheckingResult *match in matches) {
  NSURL *url = [match URL];
  if ([[url scheme] isEqual:@"tel"]) {
    NSLog(@"found telephone url: %@", url);
  } else {
    NSLog(@"found regular url: %@", url);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...