Ява: Замена текста 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 ответов:
Попробуйте использовать:
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);