2009-12-15 13 views
9

Bazı URL'leri içeren bir tarayıcıyı, uyumlu bir URL'ye bağlayan bir URL ile değiştirmeye çalışıyorum.Java: tıklanabilir bir HTML bağlantısı olan metin URL'sini değiştirmek

"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 !" 

Bu kod hattıyla URL'yi yakalayabilirsiniz:

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

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

Ne almak istiyorum edilmektedir:

Benim ilk dize şöyle

Belki regexp ifadesinin bir miktar düzeltmeye ihtiyacı var, ancak iyi çalışıyor, daha fazla zamanda test etmeniz gerekiyor. İlginiz ve yanıtları için

sayesinde önceden yakalanan dizge:

Yani soru regexp tarafından yakalanan ifadesini tutmak ve sadece bağlantı oluşturmak için ne yapılması gerektiği bir ekleme nasıl!

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

Ben senin regex kontrol etmedi:

+0

cevaplar aşağıda size yardımcı gerekse de, sana "vahşi" görünen tüm formlarda URL'ler yakalamak için John Gruber düzenli ifade bakabilirsiniz öneririz: http: //daringfireball.net/2009/11/liberal_regex_for_matching_urls – FRotthowe

cevap

7

kullanmaya çalışın.

() kullanarak gruplar oluşturabilirsiniz. $1, grup dizinini gösterir. URL'yi $1 değiştirecektir. my question
Bazı exemples: Capturing Text in a Group in a regular expression

+0

Bu iyi çalışıyor! Çok teşekkürler: D – Dough

+0

Bu, bir metin içinde birden çok bağlantı için çalışmaz çünkü '. *' Çok fazla zaman alır. – Sonson123

1

senin regex varsayarsak size yerine geribaşvuruları kullanabilirsiniz doğru bilgi yakalamak için çalışır

Ben simalir soru soruldu. Java regexp tutorial'a bakın.

Bu durumda

, yapacağın

 
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"); 
} 

Oralarda iyi REGEXs olabilir, ama bu URL'ye veya bitiminden sonra sürece beyaz boşluk olarak hile yok edebilir URL, metnin sonundadır. Bu özel uygulama ayrıca, girilmiş olabilecek diğer HTML'lerden kaçmak için org.springframework.web.util.HtmlUtils kullanır.

+0

Sadece bir boşlukla ayrılmış iki bağlantı için çalışmaz. – Sonson123

4

Daha sağlam bir çözüm arayan herkes için Twitter Text Libraries'u önerebilirim.

new Autolink().autolink(plainText) 
+0

url iyi biçimlendirilmiş olmalıdır. algılayamadı: www.example.com (http: // eksik). :( – redochka

0

satırlı metin durumda bunu kullanabilirsiniz: Bu kütüphane ile URL'leri Değiştirme

bu gibi çalışır

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

Ve burada gerek benim kod tam bir örneğidir içinde adresler ile kullanıcının mesajları gösterir:

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

kodu "http" veya "https", l ile başlayan bağlantıları değiştirir Belows sadece "www." ile başlayan mürekkepler ve sonunda e-posta bağlantılarını da değiştirir.

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

Baskılar:

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> 
İlgili konular