Java: remplacement de l’URL du texte par un lien HTML cliquable

J’essaie de remplacer par des chaînes Ssortingng une URL vers une URL liée compatible avec un navigateur

Ma chaîne initiale ressemble à ceci:

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

Ce que je veux obtenir, c’est une chaîne ressemblant à ceci:

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

Je peux attraper l’URL avec cette ligne de code:

 Ssortingng withUrlSsortingng = mySsortingng.replaceAll(".*://[^[:space:]]+[[:alnum:]/]", "HereWasAnURL"); 

Peut-être que l’expression regexp doit être corrigée, mais elle fonctionne bien et doit être testée plus tard.

La question est donc de savoir comment conserver l’expression saisie par l’expression rationnelle et append simplement ce qui est nécessaire pour créer le lien: chaîne capturée

Merci d’avance pour votre intérêt et vos réponses!

Essayez d’utiliser:

 mySsortingng.replaceAll("(.*://[^<>[:space:]]+[[:alnum:]/])", "HereWasAnURL"); 

Je n’ai pas vérifié votre regex.

En utilisant () vous pouvez créer des groupes. Le $1 indique l’index du groupe. $1 remplacera l’URL.

J’ai posé une question simalir: ma question
Quelques exemples: Capture de texte dans un groupe dans une expression régulière

 public static Ssortingng textToHtmlConvertingURLsToLinks(Ssortingng text) { if (text == null) { return text; } Ssortingng escapedText = HtmlUtils.htmlEscape(text); return escapedText.replaceAll("(\\A|\\s)((http|https|ftp|mailto):\\S+)(\\s|\\z)", "$1https://stackoverflow.com/questions/1909534/java-replacing-text-url-with-clickable-html-link/$2$4"); } 

Il y a peut-être de meilleurs REGEX sur le marché, mais cela rest efficace tant qu’il y a un espace après la fin de l’URL ou que l’URL se trouve à la fin du texte. Cette implémentation particulière utilise également org.springframework.web.util.HtmlUtils pour échapper à tout autre code HTML éventuellement entré.

Pour ceux qui recherchent une solution plus robuste, je peux suggérer les bibliothèques de texte Twitter .

Remplacer les URL par cette bibliothèque fonctionne comme ceci:

 new Autolink().autolink(plainText) 

Le code Belows remplace les liens commençant par “http” ou “https”, les liens commençant simplement par “www.” et remplace enfin les liens de messagerie.

  Pattern httpLinkPattern = Pattern.comstack("(http[s]?)://(www\\.)?([\\S&&[^.@]]+)(\\.[\\S&&[^@]]+)"); Pattern wwwLinkPattern = Pattern.comstack("(?$0"); final Matcher wwwLinksMatcher = wwwLinkPattern.matcher(textWithHttpLinksEnabled); textWithHttpLinksEnabled = wwwLinksMatcher.replaceAll("$0"); final Matcher mailLinksMatcher = mailAddressPattern.matcher(textWithHttpLinksEnabled); textWithHttpLinksEnabled = mailLinksMatcher.replaceAll("$0"); System.out.println(textWithHttpLinksEnabled); } 

Impressions:

 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 

En supposant que votre expression rationnelle fonctionne pour capturer les informations correctes, vous pouvez utiliser des références arrières dans votre substitution. Voir le tutoriel Java regexp .

Dans ce cas, tu ferais

 mySsortingng.replaceAll (....., " \ 1 ")

En cas de texte multiligne, vous pouvez utiliser ceci:

 text.replaceAll("(\\s|\\^|\\A)((http|https|ftp|mailto):\\S+)(\\s|\\$|\\z)", "$1https://stackoverflow.com/questions/1909534/java-replacing-text-url-with-clickable-html-link/$2$4"); 

Et voici un exemple complet de mon code dans lequel je dois afficher les messages de l’utilisateur contenant des URL:

 private static final Pattern urlPattern = Pattern.comstack( "(\\s|\\^|\\A)((http|https|ftp|mailto):\\S+)(\\s|\\$|\\z)"); Ssortingng userText = ""; // user content from db Ssortingng replacedValue = HtmlUtils.htmlEscape(userText); replacedValue = urlPattern.matcher(replacedValue).replaceAll("$1https://stackoverflow.com/questions/1909534/java-replacing-text-url-with-clickable-html-link/$2$4"); replacedValue = SsortingngUtils.replace(replacedValue, "\n", "
"); System.out.println(replacedValue);