如何从NSString中的句子中提取URL?

0SX*_*0SX 23 regex iphone cocoa-touch nsstring

我想要完成的是如下.我有一个NSString,其中一个句子在感知中有一个URL.我需要能够获取NSString中任何句子中显示的URL,例如:

假设我有这个NSString

NSString *someString = @"This is a sample of a http://abc.com/efg.php?EFAei687e3EsA sentence with a URL within it.";
Run Code Online (Sandbox Code Playgroud)

我需要能够从该NSString中提取http://abc.com/efg.php?EFAei687e3EsA.这个NSString不是静态的,并且将改变结构,并且url不一定在句子的同一位置.我试着调查三个代码,但对我来说没有意义.怎么办呢?感谢帮助.

Dav*_*ong 89

使用NSDataDetector:

NSString *string = @"This is a sample of a http://abc.com/efg.php?EFAei687e3EsA sentence with a URL within it.";
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) {
    NSURL *url = [match URL];
    NSLog(@"found URL: %@", url);
  }
}
Run Code Online (Sandbox Code Playgroud)

这样您就不必依赖不可靠的正则表达式,并且当Apple升级其链接检测代码时,您可以免费获得这些改进.


Ita*_*ber 21

编辑:我要在这里走出去,说你应该NSDataDetector像Dave提到的那样使用.比正则表达式更不容易出错.


看看正则表达式.您可以使用NSRegularExpression类构建一个简单的URL来提取URL (仅适用于iPhone,但由于这是您的目标,您可以),或者在线找到一个可以使用的URL .有关使用该类的教程,请参阅此处.


你想要的代码基本上是这样的(使用John Gruber的超级URL正则表达式):

NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))" options:NSRegularExpressionCaseInsensitive error:NULL];
NSString *someString = @"This is a sample of a http://abc.com/efg.php?EFAei687e3EsA sentence with a URL within it.";
NSString *match = [someString substringWithRange:[expression rangeOfFirstMatchInString:someString options:NSMatchingCompleted range:NSMakeRange(0, [someString length])]];
NSLog(@"%@", match); // Correctly prints 'http://abc.com/efg.php?EFAei687e3EsA'
Run Code Online (Sandbox Code Playgroud)

这将提取任何字符串中的第一个URL(当然,这不会进行错误检查,因此如果字符串确实不包含任何URL,它将无法工作,但请查看NSRegularExpression该类以了解如何绕过它.


Ahm*_*nay 5

使用像这样:

NSError *error = nil;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink
                                                           error:&error];

[detector enumerateMatchesInString:someString
                           options:0
                             range:NSMakeRange(0, someString.length)
                        usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop)
 {
     if (result.resultType == NSTextCheckingTypeLink)
     {
         NSString *str = [NSString stringWithFormat:@"%@",result.URL];
         NSLOG(%@,str);

     }
 }];
Run Code Online (Sandbox Code Playgroud)

这将逐个输出someString中的所有链接