用href替换文本中的URL(在Java中)

时间:2018-03-22 10:16:26

标签: java regex href

我必须将以纯文本形式输入的网址转换为html hrefs,我想找到多个网址。

此:     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开头的网址。

知道他的正则表达式的人能帮助我吗?

3 个答案:

答案 0 :(得分:0)

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

使用此RegEx:

\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(带有协议,在句子中)

Example 1

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

Example 2

答案 1 :(得分:0)

通过周围环境来制作www optinnal。 你的情况试试这个:

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

答案 2 :(得分:0)

您可以尝试以下模式。

  

((HTTPS | FTP)://)?(?WWW \ d | [A-ZA-Z0-9] +)[α-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();
}