如何使用javaregex删除msword不必要的html标记

czq61nw1  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(277)

我有一个wysiwyg编辑器,有时用户会从微软的word中剪切过去。在我的服务器端java中,我尝试从粘贴的html中删除不必要的html,例如:

<o:p>

应该是:

<p>

我试图消除的模式是:

//Remove:
  // unnecessary tag spans (comments and title)
  //   <!--(w|W)+?-->
  //   <title>(w|W)+?</title>
  //classes and styles
  //    s?class=w+
  //    s+style='[^']+'
  //unnecessary tags
  //    <(meta|link|/?o:|/?style|/?div|/?std|/?head|/?html|body|/?body|/?span|![)[^>]*?>
  //empty paragraph tags
  //    (<[^>]+>)+&nbsp;(</w+>)+
  //bizarre v: element attached to <img> tag
  //    s+v:w+=""[^""]+""

我的代码是:

Pattern p = Pattern.compile("<!--(w|W)+?-->?|<title>(w|W)+?</title>?|s+style='[^']+'?|"
        + "<(meta|link|/?o:|/?style|/?div|/?std|/?head|/?html|body|/?body|/?span|![)[^>]*?>?|"
        + "(<[^>]+>)+&nbsp;(</w+>)+?", Pattern.CASE_INSENSITIVE);
  Matcher m = p.matcher(html);
  String result = m.replaceAll("");

我得到一个错误:

java.util.regex.PatternSyntaxException: Unclosed character class near index 163
<!--(w|W)+?-->?|<title>(w|W)+?</title>?|s+style='[^']+'?|<(meta|link|/?o:|/?style|/?div|/?std|/?head|/?html|body|/?body|/?span|![)[^>]*?>?|(<[^>]+>)+&nbsp;(</w+>)+?

有人能告诉我正确的语法吗。
wiktor提供了一个极好的答案;不过,颜色风格是删除,我想保留,如果可能的话。
清洁前:

notClean: <p class="MsoNormal"><b><span lang="EN-AU" style="font-size:11.0pt;font-family:&quot;Verdana&quot;,sans-serif;color:#006600">Special
Interest Area badges youth members can achieve, supported by Queensland
Environmental Education Team:<o:p></o:p></span></b></p><p class="MsoNormal"><b><span lang="EN-AU">&nbsp;</span></b></p><p class="MsoNormal"><b><span lang="EN-AU">&nbsp;</span></b></p><p>

</p><p class="MsoNormal"><b><i><span lang="EN-AU" style="font-size:11.0pt;font-family:&quot;Verdana&quot;,sans-serif">Joey Scout SIA Badges
(2 hours each badge)</span></i></b><b><span lang="EN-AU" style="font-size:11.0pt;font-family:&quot;Verdana&quot;,sans-serif"><o:p></o:p></span></b></p>

清洁后:

cleaned: <p class="MsoNormal"><b>Special
Interest Area badges youth members can achieve, supported by Queensland
Environmental Education Team:<p>

</p><p class="MsoNormal"><b><i>Joey Scout SIA Badges
(2 hours each badge)</i></b><b></b></p>

我试过:

Pattern p = Pattern.compile("<!--.*?-->|<title>.*?</title>|"
            + "<(meta|link|/?o:|/?div|/?std|/?head|/?html|/?body|/?span|!\\[)[^>]*>|"
            + "(<[^>]+>)+&nbsp;(</\\w+>)+", Pattern.CASE_INSENSITIVE|Pattern.DOTALL);

但是,样式仍然被删除。
我还得把“span”留在里面。

mklgxw1f

mklgxw1f1#

你可以用

String html = "Cleaned!<!-- \nsome comment --><title> my title</title> style='OUR_STYLE'<meta ...>";
Pattern p = Pattern.compile("<!--.*?-->|<title>.*?</title>|\\s+style='[^']+'|"
        + "<(meta|link|/?o:|/?style|/?div|/?std|/?head|/?html|/?body|/?span|!\\[)[^>]*>|"
        + "(<[^>]+>)+&nbsp;(</\\w+>)+", Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
Matcher m = p.matcher(html);
String result = m.replaceAll("");
System.out.println(result);
// => Cleaned!

请参见java演示。
笔记: Pattern.DOTALL 制造 . matcb包括换行符在内的任何字符(因此不需要使用类似 [\w\W] )
不要忘记正则表达式转义中的转义反斜杠,比如 \s 或者 \w (在java字符串文本中, "\\s" 或者 "\\w" )
别忘了避开特殊的regex元字符,比如 [ 或者 ( ,查看正则表达式中必须转义哪些特殊字符?
如果字符串中必须存在字符,请不要将 ? 在它之后(例如 > 在您的模式中),它使char成为可选的。

vc6uscn9

vc6uscn92#

我相信你需要逃离那些特殊的角色 <([{\^-=$!|]})?*+.> 这里有更多信息的链接。

相关问题