Objective-C:如何在字符串中检测HTTP URL?

7

假设我有以下字符串:

"I love visiting http://www.google.com"

我如何检测令牌 http://www.google.com


请参考 https://dev59.com/9G455IYBdhLWcg3wAvNI,该链接提供了几个选项,具体取决于目标iOS版本。 - InsertWittyName
可能是重复的问题:使用正则表达式无法检测到http链接 - jscs
2个回答

26

你可以使用NSDataDetectors。这些功能在iOS4中添加,非常实用。你需要使用NSTextCheckingTypeLink创建数据检测器,并让它发挥作用。

NSString *testString = @"Hello http://google.com world";
NSDataDetector *detect = [[NSDataDetector alloc] initWithTypes:NSTextCheckingTypeLink error:nil];
NSArray *matches = [detect matchesInString:testString options:0 range:NSMakeRange(0, [testString length])];
NSLog(@"%@", matches);

您也可以使用自定义的检测器吗?编辑:我发现它只是NSRegulatExpression的子类。嘿嘿,我有点傻。 - Moshe
顺便说一句,不仅 iOS 4+,OS X 10.7 现在也知道它们了。 - Rudy Velthuis
事实上,我是在10.7中编写了那个示例。 - Joshua Weinberg
感谢您提供的出色答案。我的问题在于我在UIWebView上使用了粗体字链接,因此一旦内置数据检测器注入链接标签,它就会更新Web视图内容大小并破坏我在其他地方的大小计算。自己进行数据检测使我能够在我想要的时候精确地发生! - mjisrawi
这是一个很好的答案,但我发现它不能支持许多新的域名,例如:.xyz,.party ... :( - Soyoes

1
你可以这样做:
-(BOOL)textIsUrl:(NSString*)someString {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES ^[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?$"];

    [predicate evaluateWithObject:someString];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接