2009-12-15 82 views
9

我正在嘗試將包含某些URL的字符串替換爲瀏覽器兼容鏈接的URL。Java:用可點擊的HTML鏈接替換文本URL

我的初始字符串看起來是這樣的:

"hello, i'm some text with an url like http://www.the-url.com/ and I need to have an hypertext link !" 

我想是一個字符串看起來像:

"hello, i'm some text with an url like <a href="http://www.the-url.com/">http://www.the-url.com/</a> and I need to have an hypertext link !" 

我能趕上URL使用此代碼行:

String withUrlString = myString.replaceAll(".*://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"null\">HereWasAnURL</a>"); 

也許正則表達式表達式需要一些修正,但它工作正常,需要進一步測試。

所以現在的問題是如何保持在正則表達式擦肩而過表達,只是增加一個什麼需要創建鏈接:逮住串提前

感謝您的關注和響應!

+0

雖然答案下面應該幫助你,我建議你看看約翰·格魯伯的正則表達式「在野外」捕捉到在出現各種形式的網址:HTTP: //daringfireball.net/2009/11/liberal_regex_for_matching_urls – FRotthowe

回答

7

嘗試使用:

myString.replaceAll("(.*://[^<>[:space:]]+[[:alnum:]/])", "<a href=\"$1\">HereWasAnURL</a>"); 

我沒有檢查你的正則表達式。您可以創建組。 $1表示組索引。 $1將替換網址。

我問了一個問題simalir:my question
一些exemples:Capturing Text in a Group in a regular expression

+0

這工作正常! 非常感謝:D – Dough

+0

這對於文本中的多個鏈接不起作用,因爲'。*'需要太多。 – Sonson123

1

假設你的正則表達式的作品捕捉到正確的信息,您可以在取代中使用反向引用。請參閱Java regexp tutorial

在這種情況下,你會做

 
myString.replaceAll(....., "<a href=\"\1\">\1</a>") 
6
public static String textToHtmlConvertingURLsToLinks(String text) { 
    if (text == null) { 
     return text; 
    } 

    String escapedText = HtmlUtils.htmlEscape(text); 

    return escapedText.replaceAll("(\\A|\\s)((http|https|ftp|mailto):\\S+)(\\s|\\z)", 
     "$1<a href=\"$2\">$2</a>$4"); 
} 

可能有更好的REGEXs在那裏,但只要有空格,這做的伎倆URL或結束後網址位於文本的末尾。這個特定的實現還使用org.springframework.web.util.HtmlUtils來轉義可能已經輸入的任何其他HTML。

+0

對於僅由一個空格分隔的兩個鏈接不起作用。 – Sonson123

4

對於任何人誰是尋找一個更強大的解決方案,我可以建議Twitter Text Libraries

與此庫更換網址是這樣的:

new Autolink().autolink(plainText) 
+0

網址必須格式良好。無法檢測:www.example.com(http:// missing)。 :( – redochka

0

在多行文本的情況下,你可以使用這個:

text.replaceAll("(\\s|\\^|\\A)((http|https|ftp|mailto):\\S+)(\\s|\\$|\\z)", 
     "$1<a href='$2'>$2</a>$4"); 

這裏是我的代碼完整的例子,我需要顯示用戶的帖子與其中的網址:

private static final Pattern urlPattern = Pattern.compile(
     "(\\s|\\^|\\A)((http|https|ftp|mailto):\\S+)(\\s|\\$|\\z)"); 


String userText = ""; // user content from db 
String replacedValue = HtmlUtils.htmlEscape(userText); 
replacedValue = urlPattern.matcher(replacedValue).replaceAll("$1<a href=\"$2\">$2</a>$4"); 
replacedValue = StringUtils.replace(replacedValue, "\n", "<br>"); 
System.out.println(replacedValue); 
2

白令代碼代替以「http」或「https」開頭的鏈接,l墨水只以「www」開始。並最終取代電子郵件鏈接。

Pattern httpLinkPattern = Pattern.compile("(http[s]?)://(www\\.)?([\\S&&[^[email protected]]]+)(\\.[\\S&&[^@]]+)"); 

    Pattern wwwLinkPattern = Pattern.compile("(?<!http[s]?://)(www\\.+)([\\S&&[^[email protected]]]+)(\\.[\\S&&[^@]]+)"); 

    Pattern mailAddressPattern = Pattern.compile("[\\S&&[^@]][email protected]([\\S&&[^[email protected]]]+)(\\.[\\S&&[^@]]+)"); 

    String textWithHttpLinksEnabled = 
    "ajdhkas www.dasda.pl/asdsad?asd=sd www.absda.pl [email protected] klajdld http://dsds.pl httpsda http://www.onet.pl https://www.onsdas.plad/dasda"; 

    if (Objects.nonNull(textWithHttpLinksEnabled)) { 

     Matcher httpLinksMatcher = httpLinkPattern.matcher(textWithHttpLinksEnabled); 
     textWithHttpLinksEnabled = httpLinksMatcher.replaceAll("<a href=\"$0\" target=\"_blank\">$0</a>"); 

     final Matcher wwwLinksMatcher = wwwLinkPattern.matcher(textWithHttpLinksEnabled); 
     textWithHttpLinksEnabled = wwwLinksMatcher.replaceAll("<a href=\"http://$0\" target=\"_blank\">$0</a>"); 

     final Matcher mailLinksMatcher = mailAddressPattern.matcher(textWithHttpLinksEnabled); 
     textWithHttpLinksEnabled = mailLinksMatcher.replaceAll("<a href=\"mailto:$0\">$0</a>"); 

     System.out.println(textWithHttpLinksEnabled); 
    } 

打印:

ajdhkas <a href="http://www.dasda.pl/asdsad?asd=sd" target="_blank">www.dasda.pl/asdsad?asd=sd</a> <a href="http://www.absda.pl" target="_blank">www.absda.pl</a> <a href="mailto:[email protected]">[email protected]</a> klajdld <a href="http://dsds.pl" target="_blank">http://dsds.pl</a> httpsda <a href="http://www.onet.pl" target="_blank">http://www.onet.pl</a> <a href="https://www.onsdas.plad/dasda" target="_blank">https://www.onsdas.plad/dasda</a>