【问题标题】:Replace URL in text with href (in Java)用 href 替换文本中的 URL(在 Java 中)
【发布时间】:2018-08-31 17:35:57
【问题描述】:

我必须将以纯文本输入的 url 转换为 html href,我想找到多个 url。

这个: Hi here is a link for you: http://www.google.com. Hope it works.

将成为: Hi here is a link for you: <a href='http://www.google.com'>http://www.google.com</a>. Hope it works.

找到这个代码:

public String transformURLIntoLinks(String text){
String urlValidationRegex = "(https?|ftp)://(www\\d?|[a-zA-Z0-9]+)?.[a-zA-Z0-9-]+(\\:|.)([a-zA-Z0-9.]+|(\\d+)?)([/?:].*)?";
Pattern p = Pattern.compile(urlValidationRegex);
Matcher m = p.matcher(text);
StringBuffer sb = new StringBuffer();
while(m.find()){
    String found =m.group(0); 
    m.appendReplacement(sb, "<a href='"+found+"'>"+found+"</a>"); 
}
m.appendTail(sb);
return sb.toString();
}

张贴在这里https://stackoverflow.com/a/17704902

而且效果很好。对于所有以http 为前缀的网址。 但我也想找到以www 开头的网址。

知道他的正则表达式的任何人都可以帮助我吗?

【问题讨论】:

  • 尝试以(?:(https?|ftp):\/\/)? 开始您的正则表达式,它将与仅以www 开头的url 匹配

标签: java regex href


【解决方案1】:

(https?|ftp):// 部分设为可选。这是通过添加问号? 来完成的。所以会是((https?|ftp)://)?

使用这个正则表达式:

\b((https?|ftp):\/\/)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[A-Za-z]{2,6}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)*(?:\/|\b)

转义 Java 转义字符 (\):

\\b((https?|ftp):\\/\\/)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[A-Za-z]{2,6}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)*(?:\\/|\\b)

示例

示例 1(带有协议,在句子中)

示例 2(无协议,在句子中)

【讨论】:

  • 我正在转换的文本不仅仅是网址。尝试实现您的代码,但它把我的文本中的所有内容都变成了 href 这:Hi here's a link for you www.google.com Take care! 变成:&lt;a href='Hi here's'&gt;Hi here's&lt;/a&gt;&lt;a href=' a link'&gt; a link&lt;/a&gt;&lt;a href=' for you'&gt; for you&lt;/a&gt;&lt;a href='www.google.com'&gt;www.google.com&lt;/a&gt;&lt;a href='Take care!'&gt;Take care!&lt;/a&gt;
  • @Anders 我已经编辑了我的答案。我不知道它应该从一个句子中获取链接。它现在应该可以工作了。
  • 像魅力一样工作。添加了一些添加协议的代码,一切就绪。感谢您的帮助!
【解决方案2】:

通过包围使 www optinnal。 你试试这个:

  final String urlValidationRegex = "(https?|ftp)://(www\\d?)?(|[a-zA-Z0-9]+)?.[a-zA-Z0-9-]+(\\:|.)([a-zA-Z0-9.]+|(\\d+)?)([/?:].*)?"

【讨论】:

  • 这不是 OP 所要求的。他希望能够省略协议,而不是子域。
【解决方案3】:

您可以尝试以下模式。

((https?|ftp)://)?(www\d?|[a-zA-Z0-9]+)?.[a-zA-Z0-9-]+(:|.) ([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?

更新后的代码将是

public String transformURLIntoLinks(String text){
String urlValidationRegex = "((https?|ftp)://)?(www\\d?|[a-zA-Z0-9]+)?.[a-zA-Z0-9-]+(\\:|.)([a-zA-Z0-9.]+|(\\d+)?)([/?:].*)?";
Pattern p = Pattern.compile(urlValidationRegex);
Matcher m = p.matcher(text);
StringBuffer sb = new StringBuffer();
while(m.find()){
    String found =m.group(0); 
    m.appendReplacement(sb, "<a href='"+found+"'>"+found+"</a>"); 
}
m.appendTail(sb);
return sb.toString();
}

【讨论】:

  • 既然可以使用(something)?,为什么还要使用(something|)
  • 是的,使用元字符总是更好。更新了帖子,谢谢。
猜你喜欢
  • 2016-05-03
  • 2018-03-22
  • 2023-03-27
  • 1970-01-01
  • 2014-07-22
  • 2023-01-12
  • 2011-09-12
  • 2012-04-23
  • 1970-01-01
相关资源
最近更新 更多