1

我必须从包含网页源代码的 java 类编写 HTML 报告。所以问题是,一旦遇到网页的源代码,浏览器就会认为它是主报告页面上 html 标记的结尾,因此无法正确呈现输出。一个例子如下所示 :

<html>
    <body>
        <li>
           <pre>
           <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
           <html>
           <head>
           <title>404 Not Found</title>
           </head><body>
           <h1>Not Found</h1>
           The page was not found on this server.
           </body>
           </html> 
           </pre>
        </li>
    </body>
</html>

我希望 pre 标签内的所有内容都必须作为普通文本而不是 html 标记。我尝试用<, &lt;with >, &gt;with&等替换&amp;。但它似乎不起作用。关于如何使这成为可能的任何提示?

编辑:这是我尝试过的(a 是 pre 标签内的部分)

File aFile = new File(filename);
try {
    BufferedWriter out = new BufferedWriter(new FileWriter(aFile,aFile.exists()));  
    a.replaceAll("<","&lt;");a.replaceAll(">","&gt;");a.replaceAll("\"","&;quot;");a.replaceAll("&","&amp;");
    out.write(a + "\r\n");    
    out.close();
} 

编辑2:

所以这个正确的解决方案涉及 a=a.replaceAll(...),但要注意的另一件事是,如果我用 > 替换 < ,然后我用 & 替换 & (就像我在上面的例子中所做的那样),它会再次弄乱我的输出(< 将变为 <)。所以顺序也必须改变(replcae & first 然后 <)。

4

5 回答 5

2

在 Java 中,String 对象是不可变的。这意味着a.replaceAll不会更改a,但会返回发生替换的新 String 对象。

因此,要解决此问题,您需要改为使用返回的对象:

a = a.replaceAll("&","&amp;").replaceAll("<","&lt;");

而且您实际上只需要为您的特定应用程序替换&and <

于 2013-05-12T13:32:44.580 回答
1

好吧..replaceAll可能会工作..但是,我总是更喜欢使用StingEscapeUtils作为..

a = StringEscapeUtils.escapeHtml4(a)
于 2013-05-12T13:50:40.933 回答
1

做:

a = a.replaceAll("<","&lt;");

代替 :

a.replaceAll("<","&lt;");

和其他人一样......因为 replaceAll 方法不会更改字符串,而是返回一个新字符串

于 2013-05-12T13:29:14.520 回答
1

您在评论中发布的序列:

a.replaceAll("<","&lt;");
a.replaceAll(">","&gt;");
a.replaceAll("\"","&;quot;");
a‌​.replaceAll("&","&amp;"); 

不起作用,因为该replaceAll()方法不会改变String它被调用的方式。它不能,Strings在 Java中是不可变的。
此外,正如@Rishabh 指出的那样,您的最后一次替换调用会弄乱以前的替换,因此您需要更改顺序。

你需要做

a = a.replaceAll("&","&amp;");
a = ...

或者,只做所有这些而不保存中间结果:

a = a.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll("\"","&;quot;"); 

此外,您可能应该使用replace()方法而不是replaceAll(),在这种情况下不需要使用正则表达式。

于 2013-05-12T13:29:51.960 回答
0

替换这一行:

a.replaceAll("<","&lt;");a.replaceAll(">","&gt;");a.replaceAll("\"","&;quot;");a.replaceAll("&","&amp;");

像这样:

a = a.replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll("\"","&;quot;").replaceAll("&","&amp;");
于 2013-05-12T13:29:48.810 回答