2009-12-15 12 views
9

Sto provando a fare qualcosa con la sostituzione di String contenente un URL per un URL collegato compatibile con il browser.Java: sostituzione dell'URL di testo con collegamento HTML cliccabile

mio String iniziale si presenta così:

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

Quello che voglio ottenere è una stringa alla ricerca come:

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

posso prendere URL con questa linea di codice:

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

Forse l'espressione regexp ha bisogno di una correzione, ma funziona bene, è necessario testare in un secondo momento.

Quindi la domanda è come mantenere l'espressione catturato dal regexp e basta aggiungere una ciò che è necessario per creare il collegamento: stringa catturato

Grazie in anticipo per il vostro interesse e le risposte!

+0

Mentre le risposte di seguito dovrebbero aiutarti, vi consiglio di dare un'occhiata a un'espressione regolare di John Gruber di catturare gli URL in tutte le forme che appaiono "in the wild": http: //daringfireball.net/2009/11/liberal_regex_for_matching_urls – FRotthowe

risposta

7

tenta di utilizzare:

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

non ho controllato la vostra regex.

Utilizzando () è possibile creare gruppi. Lo $1 indica l'indice di gruppo. $1 sostituirà l'url.

ho fatto una domanda simalir: my question
Alcuni esempi: Capturing Text in a Group in a regular expression

+0

Funziona bene! Molte grazie: D – Dough

+0

Questo non funziona per più collegamenti in un testo perché '. *' Richiede troppo. – Sonson123

1

Assumendo che il regex lavora per catturare le informazioni corrette, è possibile utilizzare nel vostro backreference sostituzione. Vedi lo Java regexp tutorial.

In tal caso, si farebbe

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

Ci possono essere regexs migliori là fuori, ma questo fa il trucco più a lungo in quanto v'è spazio bianco dopo la fine della URL o la L'URL è alla fine del testo. Questa particolare implementazione utilizza anche org.springframework.web.util.HtmlUtils per evitare qualsiasi altro HTML che potrebbe essere stato inserito.

+0

Non funziona per due collegamenti separati da uno spazio. L'URL – Sonson123

4

Per chiunque stia cercando una soluzione più robusta posso suggerire lo Twitter Text Libraries.

Sostituire gli URL con questa libreria funziona così:

new Autolink().autolink(plainText) 
+0

deve essere formattato correttamente. impossibile rilevare: www.example.com (http: // missing). :( – redochka

0

In caso di testo multilinea è possibile utilizzare questo:

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

E qui è pieno esempio del mio codice in cui ho bisogno di mostra i post degli utenti con gli URL in esso:

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

Codice di utenti che sostituisce i collegamenti che iniziano con "http" o "https", l inchiostri che iniziano proprio con "www." e infine sostituisce anche i collegamenti email.

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

Stampe:

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> 
Problemi correlati