Ява: Замена текста URL-адрес HTML-ссылка кликабельна


Я пытаюсь сделать некоторые вещи с заменой строки, содержащей некоторый 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 нуждается в некоторой коррекции, но оно работает нормально, нужно проверить в дальнейшем времени.

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

Заранее спасибо за ВАШ интерес и ответы !

6 9

6 ответов:

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

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

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

С помощью () можно создавать группы. $1 указывает индекс группы. $1 заменит url-адрес.

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

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

Там могут быть лучшие регулярные выражения, но это делает трюк, пока есть пробел после конца URL-адреса или URL-адрес находится в конце текста. Эта конкретная реализация также использует org.весенняя рамка.сеть.утиль.HtmlUtils, чтобы избежать любого другого HTML, который может быть введен.

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

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

new Autolink().autolink(plainText) 

Ниже код заменяет ссылки, начинающиеся с " 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>

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

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

myString.replaceAll(....., "<a href=\"\1\">\1</a>")

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

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