使用RegEx和Java删除一些HTML标记

时间:2011-09-08 11:56:24

标签: java html regex

我想从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。

你能以相当不错的方式做到这一点吗?

拥抱。

3 个答案:

答案 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

这绝对允许标签的白名单/黑名单。值得一看。