首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有NSTextCheckingTypeLink的NSDataDetector可以检测URL和PhoneNumbers!

带有NSTextCheckingTypeLink的NSDataDetector可以检测URL和PhoneNumbers!
EN

Stack Overflow用户
提问于 2011-05-11 22:25:00
回答 1查看 5.6K关注 0票数 7

我正在尝试从一个简单的NSString语句中获取一个网址。为此,我在以下代码中使用了NSDataDetector:

代码语言:javascript
复制
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和数字。该号码被检测为电话号码:

代码语言:javascript
复制
found URL: http://abc.com/efg.php?EFAei687e3EsA
found URL: tel:097843

那是个bug吗?谁能告诉我没有那个电话号码怎么获取URL?

EN

回答 1

Stack Overflow用户

发布于 2011-05-12 00:04:55

NSDataDetector必须将电话号码检测为链接,因为在电话上,您可以轻触它们,就好像它们是一个链接,以便发起电话呼叫(或轻拍并按住以发起文本消息等)。我认为当前的语言环境(即NSLocale)决定了一串数字看起来是否像电话号码。例如,在美国,至少需要七位数字才能被识别为电话号码,因为在美国,数字的一般形式是:\d{3}-\d{4}

至于识别一个电话链接与另一个链接,在网址的开头检查http://不是一个好主意。一个简单的例子就足够了:如果它是一个https://链接呢?然后你的代码就会崩溃。

检查这一点的更好方法是:

代码语言:javascript
复制
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);
  }
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5965844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档