带有NSTextCheckingTypeLink的NSDataDetector检测URL和PhoneNumbers!

use*_*081 7 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

结果是它找到了URL和数字.该号码被检测为电话号码:

found URL: http://abc.com/efg.php?EFAei687e3EsA
found URL: tel:097843
Run Code Online (Sandbox Code Playgroud)

那是一个错误吗?谁能告诉我如何获得没有该电话号码的URL?

Dav*_*ong 12

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);
  }
}
Run Code Online (Sandbox Code Playgroud)