带有NSTextCheckingTypeLink的NSDataDetector检测URL和PhoneNumbers!

时间:2011-05-11 14:25:00

标签: cocoa-touch

我想从一个简单的NSString句子中获取一个URL。为此,我在以下代码中使用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 个答案:

答案 0 :(得分:12)

NSDataDetector必须将电话号码检测为链接,因为在电话上,您可以点击它们,就好像它们是链接一样,以便发起电话呼叫(或点击并按住以发起短信等)。我相信当前的语言环境(即NSLocale)决定了一串数字是否与电话号码相似。例如,在美国,至少需要将七位数字识别为电话号码,因为美国的数字通常为\d{3}-\d{4}

至于识别电话链接与其他链接,在URL的开头检查http://并不是一个好主意。一个简单的例子就足够了:如果它是一个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);
  }
}