0

我正在尝试a使用以下代码将给定字符串中的所有链接转换为可点击标签:

String [] parts = comment.split("\\s");
String newComment=null;

for( String item : parts ) try {
    URL url = new URL(item);
    // If possible then replace with anchor...
    if(newComment==null){
        newComment="<a href=\"" + url + "\">"+ url + "</a> ";    
    }else{
        newComment=newComment+"<a href=\"" + url + "\">"+ url + "</a> ";    
    }
} catch (MalformedURLException e) {
    // If there was an URL that was not it!...
    if(newComment==null){
        newComment = item+" ";
    }else{
        newComment = newComment+item+" ";
    }
}

它适用于

Hi there, click here http://www.google.com ok?

将其转换为

Hi there, click here <a href="http://www.google.com">http://www.google.com</a> ok?

但是当字符串是这样的:

Hi there, click 

here http://www.google.com 

ok?

它仍在将其转换为:

Hi there, click here <a href="http://www.google.com">http://www.google.com</a> ok?

而我希望最终结果是:

Hi there, click 

here <a href="http://www.google.com">http://www.google.com</a> 

ok?

我认为它在进行拆分时也包括换行符。

在这种情况下如何保留换行符?

4

3 回答 3

2

我会建议一种不同的方法:

String noNewLines = "Hi there, click here http://www.google.com ok?";
String newLines = "Hi there, \r\nclick here \nhttp://www.google.com ok?";
// This is a String format with two String variables. 
// They will be replaced with the desired values once the "format" method is called.
String replacementFormat = "<a href=\"%s\">%s</a>";
// The first round brackets define a group with anything starting with
// "http(s)". The second round brackets delimit that group by a lookforward reference
// to whitespace. 
String pattern = "(http(s)?://.+?)(?=\\s)";
noNewLines = noNewLines.replaceAll(
        pattern,
        // The "$1" literals are group back-references. 
        // In our instance, they reference the group enclosed between the first
        // round brackets in the "pattern" String. 
        new Formatter().format(replacementFormat, "$1", "$1")
        .toString()
);
System.out.println(noNewLines);
System.out.println();
newLines = newLines.replaceAll(
        pattern,
        new Formatter().format(replacementFormat, "$1", "$1")
        .toString()
);
System.out.println(newLines);

输出:

Hi there, click here <a href="http://www.google.com">http://www.google.com</a> ok?

Hi there, 
click here 
<a href="http://www.google.com">http://www.google.com</a> ok?

这将替换所有指向锚引用的 http(s) 链接,无论您的文本中是否有换行符(windows 或 *nix)。

编辑

为了获得最佳编码实践,您应该将replacementFormatpattern变量设置为常量(等等final static String REPLACEMENT_FORMAT)。

编辑二

实际上,对 URl 模式进行分组并不是真正必要的,因为空格前瞻就足够了。但是,好吧,我将其保留原样,它可以工作。

于 2013-07-17T18:09:58.447 回答
2

你可以使用

字符串 [] 部分 = comment.split("\\");

代替

字符串 [] 部分 = comment.split("\\s");

正如 eldris 所说,“\s”适用于每个空白字符,所以“\”,因为空格字符本身应该为您服务。

于 2013-07-17T18:07:49.383 回答
1

我建议以下解决方案来解决您的问题:

  1. 首先由换行符分割
  2. 对于每一行进行您上面提到的处理
  3. 添加所有已处理的行

这样,新行字符将被保留,并且您将能够在每一行中执行您当前正在执行的操作。

希望这可以帮助。

干杯!!

于 2013-07-17T18:06:13.320 回答