用于删除MSWord生成的HTML标记的Java类

时间:2010-11-08 22:46:15

标签: java html ms-word

某些HTML表单由用户使用来自MSWord,FCK编辑器或其他人的复制和粘贴来填充。 这会产生令人讨厌的标签,使其他工具无法正常工作。 有没有办法服务器可以清理传入的参数,所以会删除讨厌的HTML标签?

当然,只要用户可以写任何内容,正则表达式就没用了。

我的意思是Java类专门从事这项工作。

例如,所有这些都可能被空字符串替换。

<p><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:HyphenationZone>21</w:HyphenationZone>
<w:PunctuationKerning />
<w:ValidateAgainstSchemas />
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:BreakWrappedTables />
<w:SnapToGridInCell />
<w:WrapTextWithPunct />
<w:UseAsianBreakRules />
<w:DontGrowAutofit />
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Tabla normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]--></p>

5 个答案:

答案 0 :(得分:1)

FCKEditor有一个“从word粘贴”按钮,效果很好。 您能否要求您的用户使用此功能?

答案 1 :(得分:1)

您可以尝试JTidy。它是HTMLtidy的Java端口,可以进行您正在寻找的清理类型。警告:我没有使用过JTidy,我也不知道它有多好用。

答案 2 :(得分:0)

当您从word粘贴时,最新版本的CKEditor支持自动检测,这意味着即使按钮在那里,他们也不必使用该按钮。它会检测从单词粘贴并提供清理它或将其转换为直接文本。

答案 3 :(得分:0)

docx4j生成干净的HTML,专门用于通过CKEditor进行往返。

答案 4 :(得分:0)

使用https://code.google.com/p/owasp-java-html-sanitizer/

import org.owasp.html.PolicyFactory;
import org.owasp.html.Sanitizers;

构建一个仅限html接受的策略。除了你要说的内容外,这将除去所有内容。这不仅会删除Word Html垃圾,还会保护您的HTML输入免受xss。

PolicyFactory policy = (new HtmlPolicyBuilder().allowElements("table", "tr", "td", "th").allowAttributes("style").globally()).toFactory();
        policy = policy.and(Sanitizers.FORMATTING).and(Sanitizers.BLOCKS).and(Sanitizers.IMAGES).and(Sanitizers.LINKS);

String safeHtml = policy.sanitize(html);

JTidy的问题在于它可能非常慢。相比之下,html清洁剂的速度非常快。