我有一个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
// (<[^>]+>)+ (</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|![)[^>]*?>?|"
+ "(<[^>]+>)+ (</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|![)[^>]*?>?|(<[^>]+>)+ (</w+>)+?
有人能告诉我正确的语法吗。
wiktor提供了一个极好的答案;不过,颜色风格是删除,我想保留,如果可能的话。
清洁前:
notClean: <p class="MsoNormal"><b><span lang="EN-AU" style="font-size:11.0pt;font-family:"Verdana",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"> </span></b></p><p class="MsoNormal"><b><span lang="EN-AU"> </span></b></p><p>
</p><p class="MsoNormal"><b><i><span lang="EN-AU" style="font-size:11.0pt;font-family:"Verdana",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:"Verdana",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|!\\[)[^>]*>|"
+ "(<[^>]+>)+ (</\\w+>)+", Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
但是,样式仍然被删除。
我还得把“span”留在里面。
2条答案
按热度按时间mklgxw1f1#
你可以用
请参见java演示。
笔记:
Pattern.DOTALL
制造.
matcb包括换行符在内的任何字符(因此不需要使用类似[\w\W]
)不要忘记正则表达式转义中的转义反斜杠,比如
\s
或者\w
(在java字符串文本中,"\\s"
或者"\\w"
)别忘了避开特殊的regex元字符,比如
[
或者(
,查看正则表达式中必须转义哪些特殊字符?如果字符串中必须存在字符,请不要将
?
在它之后(例如>
在您的模式中),它使char成为可选的。vc6uscn92#
我相信你需要逃离那些特殊的角色
<([{\^-=$!|]})?*+.>
这里有更多信息的链接。