我正在尝试将包含某些URL的String替换为与浏览器兼容的链接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表达式需要一些修正,但它工作正常,需要进一步测试。
所以问题是如何保持regexp捕获的表达式,只需添加创建链接所需的内容:catched string
提前感谢您的关注和回应!
答案 0 :(得分:7)
尝试使用:
myString.replaceAll("(.*://[^<>[:space:]]+[[:alnum:]/])", "<a href=\"$1\">HereWasAnURL</a>");
我没有检查你的正则表达式。
通过使用()
,您可以创建群组。 $1
表示组索引。
$1
将替换该网址。
我问了一个simalir问题:my question
一些例子:Capturing Text in a Group in a regular expression
答案 1 :(得分: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");
}
可能有更好的REGEX,但只要在URL结尾后有空格或URL在文本末尾,这就可以解决问题。此特定实现还使用org.springframework.web.util.HtmlUtils来转义可能已输入的任何其他HTML。
答案 2 :(得分:5)
答案 3 :(得分:2)
Belows代码替换以“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>
答案 4 :(得分:1)
假设您的正则表达式可以捕获正确的信息,您可以在替换中使用反向引用。请参阅Java regexp tutorial。
在这种情况下,你会做
myString.replaceAll(....., "<a href=\"\1\">\1</a>")
答案 5 :(得分:0)
如果是多行文字,您可以使用:
text.replaceAll("(\\s|\\^|\\A)((http|https|ftp|mailto):\\S+)(\\s|\\$|\\z)",
"$1<a href='$2'>$2</a>$4");
以下是我的代码的完整示例,我需要在其中显示带有网址的用户帖子:
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);