聪明地识别电话号码和文字(包括国际号码)

时间:2012-03-26 23:13:15

标签: objective-c ios xcode nsmutablearray

我正在尝试创建一个应用程序,允许您转到适当的应用程序的特定应用程序(具体来说,常规的网络链接转到Safari,YouTube链接转到YouTube,谷歌地图链接转到地图应用程序,行文本转到Notes应用程序,电话号码转到联系人(对于iPhone以外的任何iOS设备)或电话应用程序。所有数据都在表视图中查看。

现在,我有一个NSMutableArray,它有一些虚拟数据(具体来说,是每种数据类型之一)。我已成功使用网络链接,YouTube链接和Google地图链接。问题是,我不知道如何识别国内和国际电话号码。

这是NSMutableArray数据:

NSMutableArray *sites = [[NSMutableArray alloc] initWithObjects:@"http://www.apple.com/", @"http://www.youtube.com/watch?v=QH2-TGUlwu4", @"http://maps.google.com/maps?saddr=CN+Tower&daddr=1+Yorkdale+Road+%23500,+Toronto,+ON+M6A+2T9,+Canada+(Yorkdale+Shopping+Centre)&hl=en&sll=43.68515,-79.422475&sspn=0.133818,0.308647&geocode=FdzumQIdjqBE-yGBdRzexNjtFQ%3BFUk0mwIdOp1D-yG5Hg9iD9hImQ&vpsrc=0&t=w&mra=ls&z=12", @"This is a test", @"(416)-555-5555", nil];

也...

self.cloudsendList = sites;

以下是我用户点击表格视图单元格时的代码:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat: @"%@", [cloudsendList objectAtIndex:indexPath.row]]]];
}

我不知道是否必须使用大量代码执行此操作,但是,它有可能吗?如果是的话,你将如何实现它?如果使用需要查看更多代码才能理解,那么我很乐意发布相关信息。我希望我没有造成太多麻烦,但我希望你能帮助我。如果这听起来像一个总菜鸟,我道歉。提前致谢! :)

3 个答案:

答案 0 :(得分:2)

我的感觉是,由于Apple已经在UITextView的数据检测器中解决了这个问题,因此最好使用他们的解决方案。通用电话号码检测器/格式化程序很难实现(即使Apple并不完美),您可能会花费大量时间在一个非常脆弱的解决方案上。

我建议将UITextView添加到UITableViewCell contentView(正确大小和格式化),并确保数据检测已打开。

答案 1 :(得分:1)

而不是滚动自己,结帐Apple's NSDataDetector class。我99%肯定这个班级使用了一堆正则表达式,但好处是它经受住了比你自己合理做的更多的测试。

答案 2 :(得分:0)

您将要使用正则表达式。这是做到这一点的唯一方法。这是其中许多的索引。

http://regexlib.com/DisplayPatterns.aspx?categoryId=7&cattabindex=6&AspxAutoDetectCookieSupport=1

我不确定你是否能够通过一个正则表达式检测所有国家/地区。您可能需要执行多次传递以扫描所有这些传递。

因此,擦除所有数据,存储该数据块的匹配项,然后使用该数据调用url。当然你知道如何在对象中使用if / else。