我想从String中删除HTML标记。 这很容易,我知道,我这样做了:
public String removerTags(String html)
{
return html.replaceAll("\\<(/?[^\\>]+)\\>", " ").replaceAll("\\s+", " ").trim();
}
问题是我不想删除所有标签..我想要标签
<span style=\"background-color: yellow\"> (text) </ span>
在字符串中保持完整..
我在使用GWT搜索Web应用程序时使用它作为一种“亮点”我正在做...
我需要这样做,因为如果搜索找到包含某些HTML标记的文本(索引由Lucene完成),并且它被破坏,则safeHTMLBuilder中的appendHTML无法挂载String。
你能以相当不错的方式做到这一点吗?
拥抱。
答案 0 :(得分:4)
我强烈建议您使用JSoup执行此任务。正则表达式不太适合这个任务imo。使用JSoup,这基本上是一个简单,易读且易于维护的单行程序!
查看JSoup.clean
方法,也许还有这篇文章:
答案 1 :(得分:1)
我只使用正则表达式找到了解决此问题的方法:
public static String filterHTMLTags(String html) {
// save valid tags:
String striped = html.replaceAll("(?i)\\<(\\s*/?(a|h\\d|b|i|em|cite|code|strong|pre|br).*?/?)\\>", "{{$1}}");
// remove all tags:
striped = striped.replaceAll("\\<(/?[^\\>]+)\\>", " ");
// restore valid tags:
striped = striped.replaceAll("\\{\\{(.+?)\\}\\}", "<$1>");
return striped;
}
请确保您在HTML内容中不使用“{{...}}”。您可以轻松更改此“保存顺序”。有效标记在第一个replaceAll正则表达式列表中定义:
(A | H \ d | B | I | EM |举|代码|强|预| BR)
上面列表中的“h \ d”表示“h1,h2,...”是有效标签。
我用这段代码测试了这个:
public static void main (String[] args) {
String teste = " <b>test bold chars</b> <BR/> <div>test div</div> \n" +
" link: <a href=\"test.html\">click here</a> <br />\n" +
" <script>bad script</script> <notpermitted/>\n";
System.out.println("teste: \n"+teste);
System.out.println("\n\n\nstriped: \n"+filterHTMLTags(teste));
}
再见 Sergio Figueiredo - My blog
答案 2 :(得分:0)
我过去常常使用的库是OWASP AntiSamy
这绝对允许标签的白名单/黑名单。值得一看。