2011-05-05 59 views
9

我目前使用的是UIWebView來設定twitter的帖子風格。有些推文當然包含URL,但不包含<a>標籤。我可以提取網址,但是我不確定如何添加<a>標籤並放回到推文中。然後,我將使用相同的方法將鏈接添加到@usernames和#hashtags。這裏是我當前的代碼示例:NSRegularExpression:用url替換url文本<a>標籤

NSString *tweet = @"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"; 

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 *match = [tweet substringWithRange:[expression rangeOfFirstMatchInString:tweet options:NSMatchingCompleted range:NSMakeRange(0, [tweet length])]]; 
NSLog(@"%@", match);// == http://ow.ly/4OaOo 

最後,我想最後一個字符串看起來像這樣:

Sync your files to your Google Docs with a folder on your desktop. Like Dropbox. Good choice, Google storage is cheap. <a href="http://ow.ly/4OaOo>http://ow.ly/4OaOo</a>

任何幫助將非常感激。

回答

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]; 
} 

下面是一個非javascript調用的Objective-C的NSString報價版本:

document.body.innerHTML = document.body.innerHTML.replace(
     /(\b(https?):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, 
     "<a href='document.location=$1'>$1</a>" 
); 

的正則表達式是不完美的,但將抓住大部分的聯繫。

+0

這將工作完美。我從來沒有想過使用JavaScript。 – 2011-05-05 21:00:20

+1

這可能是緩慢的JS,檢查我的OBJ - C的解決方案。 – 2011-05-05 21:03:48

+0

在這種情況下,如果我們使用正則表達式兩次獲得相同的鏈接link可以添加另一個 2014-07-22 03:03:13

0

您可以使用stringByReplacingOccurrencesOfString:withString:搜索您的match並用HTML鏈接替換它。

NSString *htmlTweet = [tweet stringByReplacingOccurrencesOfString:match withString:html]; 

(您可能也使用您在stringByReplacingCharactersInRange:withString:rangeOfFirstMatchInString:options:range得到的範圍內,但我不知道你傳遞一個字符串比多數民衆贊成在這種情況下,範圍長度長會發生什麼)。

請注意,您的搜索將只能找到推文中的第一個鏈接,如果有幾個匹配,您將錯過這些鏈接。

+0

感謝您的快速響應!你確實有一個關於只找到第一個鏈接的有效點,並且需要修改我的代碼。 – 2011-05-05 21:02:09