在Java中将纯文本转换为HTML文本

我有java程序,它将从服务器接收纯文本。 纯文本可能包含URL。 Java库中是否有任何类将纯文本转换为HTML文本? 还是其他任何图书馆? 如果没有那么解决方案是什么?

您应该以编程方式对文本进行一些替换。 以下是一些线索:

  • 所有换行都应转换为"
    \n"
    (\ n为了更好的输出可读性)。
  • 应删除所有CR(无论如何都使用DOS编码)。
  • 所有空格对应替换为"  "
  • 将“<”替换为“<“
  • 将“&”替换为"&"
  • 所有其他字符<128应保持原样。
  • 所有其他字符> = 128应写为"&#"+((int)myChar)+";" ,使它们在每个编码中都可读。
  • 要自动检测您的链接,您可以使用像"http://[^ ]+""www.[^ ]"这样的正则表达式,并像JB Nizet所说的那样进行转换。 ""+url+"" ,但仅在完成所有其他替换后。

执行此操作的代码如下所示:

 public static String escape(String s) { StringBuilder builder = new StringBuilder(); boolean previousWasASpace = false; for( char c : s.toCharArray() ) { if( c == ' ' ) { if( previousWasASpace ) { builder.append(" "); previousWasASpace = false; continue; } previousWasASpace = true; } else { previousWasASpace = false; } switch(c) { case '<': builder.append("<"); break; case '>': builder.append(">"); break; case '&': builder.append("&"); break; case '"': builder.append("""); break; case '\n': builder.append("
"); break; // We need Tab support here, because we print StackTraces as HTML case '\t': builder.append("     "); break; default: if( c < 128 ) { builder.append(c); } else { builder.append("&#").append((int)c).append(";"); } } } return builder.toString(); }

但是,尚未添加链接转换。 如果有人这样做,请更新代码。

我找到了使用模式匹配的解决方案。 这是我的代码 –

 String str = "(?i)\\b((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][az]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\".,<>?«»“”'']))"; Pattern patt = Pattern.compile(str); Matcher matcher = patt.matcher(plain); plain = matcher.replaceAll("$1"); 

以下是输入和输出 –

输入文本是可变的:

 some text and then the URL http://www.google.com and then some other text. 

输出:

 some text and then the URL http://www.google.com and then some other text. 

如果您的纯文本一个URL (与您在问题中写的不同于包含 超链接 ),那么将其转换为HTML中的超链接只需通过

 String hyperlink = "https://stackoverflow.com/questions/5134959/convert-plain-text-to-html-text-in-java/" + url + ""; 

用这个

 public static String stringToHTMLString(String string) { StringBuffer sb = new StringBuffer(string.length()); // true if last char was blank boolean lastWasBlankChar = false; int len = string.length(); char c; for (int i = 0; i < len; i++) { c = string.charAt(i); if (c == ' ') { // blank gets extra work, // this solves the problem you get if you replace all // blanks with  , if you do that you loss // word breaking if (lastWasBlankChar) { lastWasBlankChar = false; sb.append(" "); } else { lastWasBlankChar = true; sb.append(' '); } } else { lastWasBlankChar = false; // // HTML Special Chars if (c == '"') sb.append("""); else if (c == '&') sb.append("&"); else if (c == '<') sb.append("<"); else if (c == '>') sb.append(">"); else if (c == '\n') // Handle Newline sb.append("
"); else { int ci = 0xffff & c; if (ci < 160) // nothing special only 7 Bit sb.append(c); else { // Not 7 Bit use the unicode system sb.append("&#"); sb.append(new Integer(ci).toString()); sb.append(';'); } } } } return sb.toString(); }

在Android应用程序中,我刚刚实现了内容的HTML化(请参阅https://github.com/andstatus/andstatus/issues/375 )。 实际转换是使用Android系统库在文学3行代码中完成的。 这样可以在每个后续版本的Android库中使用更好的实现。

 private static String htmlifyPlain(String textIn) { SpannableString spannable = SpannableString.valueOf(textIn); Linkify.addLinks(spannable, Linkify.WEB_URLS); return Html.toHtml(spannable); } 

刚加入所有答案的编码:

 private static String txtToHtml(String s) { StringBuilder builder = new StringBuilder(); boolean previousWasASpace = false; for (char c : s.toCharArray()) { if (c == ' ') { if (previousWasASpace) { builder.append(" "); previousWasASpace = false; continue; } previousWasASpace = true; } else { previousWasASpace = false; } switch (c) { case '<': builder.append("<"); break; case '>': builder.append(">"); break; case '&': builder.append("&"); break; case '"': builder.append("""); break; case '\n': builder.append("
"); break; // We need Tab support here, because we print StackTraces as HTML case '\t': builder.append("     "); break; default: builder.append(c); } } String converted = builder.toString(); String str = "(?i)\\b((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][az]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'\".,<>?«»“”'']))"; Pattern patt = Pattern.compile(str); Matcher matcher = patt.matcher(converted); converted = matcher.replaceAll("$1"); return converted; }