2个回答

15

以下是 Objective-C 语言版本的代码:

NSString *regexToReplaceRawLinks = @"(\\b(https?):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])";   

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexToReplaceRawLinks
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];

NSString *string = @"Sync your files to your Google Docs with a folder on your desktop.  Like Dropbox.  Good choice, Google storage is cheap. http://ow.ly/4OaOo";

NSString *modifiedString = [regex stringByReplacingMatchesInString:string
                                                           options:0
                                                             range:NSMakeRange(0, [string length])
                                                      withTemplate:@"<a href=\"$1\">$1</a>"];

NSLog(@"%@", modifiedString);
我之前做过类似的事情,但是我使用了JavaScript来完成。当视图加载完成后,使用委托方法webViewDidFinishLoad,并注入JavaScript代码:
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *jsReplaceLinkCode = 
        @"document.body.innerHTML = " 
        @"document.body.innerHTML.replace("
            @"/(\\b(https?):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])/ig, "
            @"\"<a href='$1'>$1</a>\""
    @");";

    [webVew stringByEvaluatingJavaScriptFromString:jsReplaceLinkCode];
} 

以下是非 Objective-C 的 NSString 引号版本中的 JavaScript 调用:

document.body.innerHTML = document.body.innerHTML.replace(
      /(\b(https?):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, 
      "<a href='document.location=$1'>$1</a>"
);
正则表达式并不完美,但可以捕获大部分链接。

这将非常完美。我甚至从未考虑过使用Javascript。 - Bryan Vorel
1
可能使用js会有点慢,也可以看看我的Obj-C解决方案。 - Nick Weaver
在这种情况下,如果我们两次使用正则表达式相同的链接,则会添加{{link1:link}},可以添加另一个<a href=>。 - Tharindu Madushanka

0
你可以使用 stringByReplacingOccurrencesOfString:withString: 方法来搜索你的 match 并将其替换为 HTML 链接。
NSString *htmlTweet = [tweet stringByReplacingOccurrencesOfString:match withString:html];

你也可以使用从rangeOfFirstMatchInString:options:range获取的范围,在stringByReplacingCharactersInRange:withString:中进行替换,但是如果在这种情况下传递一个比范围长度更长的字符串,我不确定会发生什么。

请注意,您的搜索只会在推文中找到第一个链接,如果有多个匹配项,则会错过这些匹配项。


谢谢您的快速回复!您提出了一个有效的观点,只找到第一个链接并需要修改我的代码。 - Bryan Vorel

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