正则表达式去除 HTML 标签

Posted

技术标签:

【中文标题】正则表达式去除 HTML 标签【英文标题】:Regex to strip HTML tags 【发布时间】:2011-05-03 19:24:52 【问题描述】:

我有这个 html 输入:

<font size="5"><p>some text</p>
<p> another text</p></font>

我想使用正则表达式来删除 HTML 标签,这样输出是:

some text
another text

谁能建议如何使用正则表达式来做到这一点?

【问题讨论】:

不要尝试使用正则表达式解析 HTML。它只会以泪水告终。 请阅读类似问题的答案:***.com/questions/1732348/… 延伸阅读:***.com/questions/832620/stripping-html-tags-in-java 【参考方案1】:

既然你问了,这里有一个快速而肮脏的解决方案:

String stripped = input.replaceAll("<[^>]*>", "");

(Ideone.com demo)

虽然使用正则表达式处理 HTML 是一个非常糟糕的主意。上面的 hack 不会处理像

这样的东西 &lt;tag attribute="&gt;"&gt;Hello&lt;/tag&gt; &lt;script&gt;if (a &lt; b) alert('Hello&gt;');&lt;/script&gt;

等等

更好的方法是使用例如Jsoup。要从字符串中删除所有标签,您可以例如执行Jsoup.parse(html).text()

【讨论】:

&gt; 允许在引用的属性值中作为文字字符。 在这个标签之前我有 Head ,通过使用上面的 sn-p 倾斜所有这些东西我得到了头部,也有标题文本。我只需要我尝试过的这部分文本 private static final Pattern BetweenTags = Pattern.compile("

([^+");

好吧,如果它很简单,比如在不复杂的 HTML 中剥离标签,我可能会选择使用正则表达式。在您的场景中,我相信您最好使用适当的解析器。 我可以建议 input.replaceAll("]+>","");【参考方案2】:

使用 HTML 解析器。这是一个Jsoup 示例。

String input = "<font size=\"5\"><p>some text</p>\n<p>another text</p></font>";
String stripped = Jsoup.parse(input).text();
System.out.println(stripped);

结果:

一些文本另一个文本

或者如果你想保留换行符:

String input = "<font size=\"5\"><p>some text</p>\n<p>another text</p></font>";
for (String line : input.split("\n")) 
    String stripped = Jsoup.parse(line).text();
    System.out.println(stripped);

结果:

一些文字 另一个文本

Jsoup 也提供了更多优势。您可以使用select() 方法轻松提取 HTML 文档的特定部分,该方法接受类似 jQuery 的 CSS 选择器。它只要求文档在语义上格式正确。自 1998 年以来已弃用的 &lt;font&gt; 标签的存在已经不是一个很好的指示,但如果您事先深入了解 HTML 结构,它仍然是可行的。

另见:

Pros and cons of leading HTML parsers in Java

【讨论】:

请注意,使用 Jsoup 实际上不仅会去除 html 标签,还会添加空格来分隔元素。文本字母数量将大于 html 文本的数量,例如如果这就是你需要去除标签的原因,那么用 tinymce 编辑器编写。【参考方案3】:

您可以使用名为 Jericho Html 解析器的 HTML 解析器。

你可以从这里下载它 - http://jericho.htmlparser.net/docs/index.html

Jericho HTML Parser 是一个 java 库,允许分析和操作 HTML 文档的各个部分,包括服务器端标签,同时逐字复制任何无法识别或无效的 HTML。它还提供高级 HTML 表单操作功能。

存在格式错误的 HTML 不会干扰解析

【讨论】:

Jsoup 需要格式良好的 HTML,因此在处理任意 HTML 时它并不比 Jericho 好。【参考方案4】:

从aioobe的代码开始,我尝试了更大胆的:

String input = "<font size=\"5\"><p>some text</p>\n<p>another text</p></font>";
String stripped = input.replaceAll("</?(font|p)1.*?/?>", "");
System.out.println(stripped);

去除每个 HTML 标记的代码如下所示:

public class HtmlSanitizer 

    private static String pattern;

    private final static String [] tagsTab = "!doctype","a","abbr","acronym","address","applet","area","article","aside","audio","b","base","basefont","bdi","bdo","bgsound","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dir","div","dl","dt","element","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","isindex","kbd","keygen","label","legend","li","link","listing","main","map","mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes","noscript","object","ol","optgroup","option","output","p","param","plaintext","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","tt","u","ul","var","video","wbr","xmp";

    static 
        StringBuffer tags = new StringBuffer();
        for (int i=0;i<tagsTab.length;i++) 
            tags.append(tagsTab[i].toLowerCase()).append('|').append(tagsTab[i].toUpperCase());
            if (i<tagsTab.length-1) 
                tags.append('|');
            
        
        pattern = "</?("+tags.toString()+")1.*?/?>";
    

    public static String sanitize(String input) 
        return input.replaceAll(pattern, "");
    

    public final static void main(String[] args) 
        System.out.println(HtmlSanitizer.pattern);

        System.out.println(HtmlSanitizer.sanitize("<font size=\"5\"><p>some text</p><br/> <p>another text</p></font>"));
    


我写这个是为了符合 Java 1.4,出于一些可悲的原因,所以请随意使用 StringBuilder...

优点:

您可以生成要去除的标签列表,这意味着您可以保留您想要的标签 避免剥离不是 HTML 标记的内容 保留空格

缺点:

您必须列出所有要从字符串中去除的 HTML 标记。这可能很多,例如,如果您想剥离所有内容。

如果您发现任何其他缺点,我真的很高兴知道它们。

【讨论】:

【参考方案5】:

如果你使用Jericho,那么你只需要使用这样的东西:

public String extractAllText(String htmlText)
    Source source = new Source(htmlText);
    return source.getTextExtractor().toString();

当然,即使使用Element,您也可以这样做:

for (Element link : links) 
  System.out.println(link.getTextExtractor().toString());

【讨论】:

以上是关于正则表达式去除 HTML 标签的主要内容,如果未能解决你的问题,请参考以下文章

用正则表达式去除 html,除了包含字符的标签 [重复]

向各位正则高手请教:java 如何用正则 ,去除html标签之间的空格

前端JS正则表达式去除html字符中所有的标签

前端JS正则表达式去除html字符中所有的标签

java正则表达式去除html标签

HTML中如何利用正则表达式去除tr td标签