Java: замена текстового URL на кликабельную ссылку HTML - PullRequest
12 голосов
/ 15 декабря 2009

Я пытаюсь что-то сделать, заменив строку, содержащую URL-адрес, на 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>");

Возможно, выражение regexp нуждается в некоторой коррекции, но оно работает нормально, необходимо проверить в дальнейшем.

Итак, вопрос в том, как сохранить выражение, отслеживаемое регулярным выражением, и просто добавить то, что необходимо для создания ссылки: catched string

Заранее благодарим за проявленный интерес и ответы!

Ответы [ 6 ]

7 голосов
/ 15 декабря 2009

Попробуйте использовать:

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

Я не проверял ваше регулярное выражение.

Используя (), вы можете создавать группы. $1 указывает на групповой индекс. $1 заменит URL.

Я задал небольшой вопрос: мой вопрос
Некоторые примеры: Захват текста в группе в регулярном выражении

6 голосов
/ 10 ноября 2010
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 или URL в конце текста. Эта конкретная реализация также использует org.springframework.web.util.HtmlUtils для экранирования любого другого HTML-кода, который мог быть введен.

5 голосов
/ 28 сентября 2015

Для тех, кто ищет более надежное решение, я могу предложить Библиотеки текста Twitter .

Замена URL-адресов этой библиотекой работает следующим образом:

new Autolink().autolink(plainText) 
2 голосов
/ 14 февраля 2017

Ниже код заменяет ссылки, начинающиеся с «http» или «https», ссылки начинающиеся только с «www». и, наконец, заменяет также ссылки электронной почты.

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

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

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

    String textWithHttpLinksEnabled = 
  "ajdhkas www.dasda.pl/asdsad?asd=sd www.absda.pl maiandrze@asdsa.pl 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:maiandrze@asdsa.pl">maiandrze@asdsa.pl</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>
1 голос
/ 15 декабря 2009

Предполагая, что ваше регулярное выражение работает для сбора правильной информации, вы можете использовать обратные ссылки в вашей замене. См. Учебник Java regexp .

В этом случае вы бы сделали

myString.replaceAll(....., "<a href=\"\1\">\1</a>")
0 голосов
/ 06 января 2017

В случае многострочного текста вы можете использовать это:

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

А вот полный пример моего кода, где мне нужно показать сообщения пользователя с URL-адресами в нем:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...