当前位置:  开发笔记 > 编程语言 > 正文

从String中删除HTML标记

如何解决《从String中删除HTML标记》经验,为你挑选了11个好方法。

有没有一种从Java字符串中删除HTML的好方法?一个简单的正则表达式

 replaceAll("\\<.*?>","") 

会工作,但&不会正确转换,两个尖括号之间的非HTML将被删除(即.*?正则表达式将消失).



1> BalusC..:

使用HTML解析器而不是正则表达式.使用Jsoup这很简单.

public static String html2text(String html) {
    return Jsoup.parse(html).text();
}

Jsoup还支持对可定制的白名单,如果你希望只允许例如这是非常有用的去除HTML标签,.

也可以看看:

除了XHTML自包含标记之外,RegEx匹配开放标记

领先的Java HTML解析器的优缺点是什么?

JSP/Servlet Web应用程序中的XSS预防


@Zeroows:这对于Lorem ipsum 1 <3 dolor sit amet 来悲惨地失败了.同样,[HTML不是常规语言](http://stackoverflow.com/a/1732454/157882).这完全超出了我的原因,为什么每个人都在试图抛出正则表达式来解析感兴趣的部分,而不是使用真正的解析器.
Jsoup很好,但我遇到了一些缺点.我用它来摆脱XSS,所以基本上我期望一个纯文本输入,但一些邪恶的人可能会试图给我发一些HTML.使用Jsoup,我可以删除所有HTML,但不幸的是,它还会将许多空格缩小为一个并删除链接中断(\n字符)
@Ridcully:因为你想使用[`Jsoup#clean()`](http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer).
使用`Jsoup.clean(unsafeString,"",Whitelist.none(),new OutputSettings().prettyPrint(false));`来保留换行符
使用clean()仍然会导致额外的空格和\n字符被删除.例如:Jsoup.clean("a \n b",Whitelist.none())返回"a b"

2> Ken Goodridg..:

如果你正在为Android写作,你可以这样做......

android.text.Html.fromHtml(instruction).toString()


很棒的提示.:)如果您在TextView中显示文本,则可以删除.toString()以保留一些格式.

3> Chris Marast..:

如果用户输入hey!,您要显示hey!还是hey!?如果第一个,逃避少数,和html编码&符号(和可选的引号),你很好.对代码实施第二个选项的修改是:

replaceAll("\\<[^>]*>","")

但如果用户输入格式错误的内容,您将遇到问题.

您还可以查看将解析"脏"html输入的JTidy,并且应该为您提供一种删除标记的方法,保留文本.

尝试剥离html的问题是浏览器具有非常宽松的解析器,比你能找到的任何库都宽松,所以即使你尽力剥离所有标签(使用上面的替换方法,DOM库或JTidy) ,您仍然需要确保编码任何剩余的HTML特殊字符,以确保您的输出安全.



4> RealHowTo..:

另一种方法是使用 javax.swing.text.html.HTMLEditorKit来提取文本.

import java.io.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;

public class Html2Text extends HTMLEditorKit.ParserCallback {
    StringBuffer s;

    public Html2Text() {
    }

    public void parse(Reader in) throws IOException {
        s = new StringBuffer();
        ParserDelegator delegator = new ParserDelegator();
        // the third parameter is TRUE to ignore charset directive
        delegator.parse(in, this, Boolean.TRUE);
    }

    public void handleText(char[] text, int pos) {
        s.append(text);
    }

    public String getText() {
        return s.toString();
    }

    public static void main(String[] args) {
        try {
            // the HTML to convert
            FileReader in = new FileReader("java-new.html");
            Html2Text parser = new Html2Text();
            parser.parse(in);
            in.close();
            System.out.println(parser.getText());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ref:从文件中删除HTML标记以仅提取TEXT


"a c"的结果是"ab或b> c",这看起来很不幸.

5> Serge..:

我认为过滤html标签的最简单方法是:

private static final Pattern REMOVE_TAGS = Pattern.compile("<.+?>");

public static String removeTags(String string) {
    if (string == null || string.length() == 0) {
        return string;
    }

    Matcher m = REMOVE_TAGS.matcher(string);
    return m.replaceAll("");
}



6> 小智..:

使用Jericho也很简单,你可以保留一些格式(例如换行符和链接).

    Source htmlSource = new Source(htmlText);
    Segment htmlSeg = new Segment(htmlSource, 0, htmlSource.length());
    Renderer htmlRend = new Renderer(htmlSeg);
    System.out.println(htmlRend.toString());


杰里科能够解析一下换行符.Jsoup和HTMLEditorKit无法做到这一点.
杰里科的工作就像一个魅力.谢谢你的建议.一个注意事项:您不必创建整个字符串的Segment.Source扩展Segment,因此要么在Renderer构造函数中工作.

7> Damien..:

接受的答案Jsoup.parse(html).text()只有两个潜在的问题(使用JSoup 1.7.3):

它从文本中删除换行符

它将文本<script>转换为

mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有