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

Sha*_*ful 16 java

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

Dan*_*iel 25

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

  • 应将所有换行符转换为"<br>\n"(\n \n,以便更好地读取输出).
  • 应删除所有CR(无论如何都使用DOS编码).
  • 所有空间对应替换为 " &nbsp;"
  • 将"<"替换为 "&lt;"
  • 用...来代替 "&amp;"
  • 所有其他字符<128应保持原样.
  • 应将所有其他字符> = 128写为"&#"+((int)myChar)+";",以使其在每个编码中都可读.
  • 要自动检测您的链接,您可以使用像这样的正则表达式"http://[^ ]+",或者"www.[^ ]"JB Nizet所说的那样转换它们.到"<a href=\""+url+"\">"+url+"</a>",但只有在完成所有其他替换之后.

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

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

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

  • 请注意,上述代码的*转义*部分可以通过调用escapeHtml4来执行 - https://commons.apache.org/proper/commons-lang/javadocs/api-3.4/org/apache/commons/lang3/StringEscapeUtils. HTML#escapeHtml4(java.lang.String中) (3认同)

Sha*_*ful 7

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

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

以下是输入和输出 -

输入文本是可变的plain:

some text and then the URL http://www.google.com and then some other text.
Run Code Online (Sandbox Code Playgroud)

输出:

some text and then the URL <a href="http://www.google.com">http://www.google.com</a> and then some other text.
Run Code Online (Sandbox Code Playgroud)