在Java中剥离HTML标记

时间:2009-05-07 02:22:52

标签: java html

是否有现有的Java库提供了从String中剥离所有HTML标记的方法?我正在寻找与PHP中的strip_tags函数等效的东西。

我知道我可以使用this Stackoverflow question中描述的正则表达式,但是我很好奇是否已经有一个stripTags()方法可以在Apache Commons库中的某个位置浮动,可以使用。< / p>

13 个答案:

答案 0 :(得分:33)

使用JSoup,它有很好的文档记录,可以在Maven上找到,经过一天与几个图书馆共度时间后,对我而言,这是我能想象到的最好的...我自己的意见是,像将html解析为纯文本,应该可以在一行代码中解析 - &gt;否则图书馆已经以某种方式失败了...只是说^^所以在这里,JSoup的一线 - 在Markdown4J中,类似的东西是不可能的,在Markdownj中,在htmlCleaner这是痛苦的屁股有点关于50行代码......

String plain = new HtmlToPlainText().getPlainText(Jsoup.parse(html));

你得到的是真正的纯文本(不仅仅是作为字符串的html源代码,就像在其他库中一样) - &gt;他真的做得很好。它与Markdownify for PHP或多或少相同的质量....

答案 1 :(得分:29)

无论您做什么,请确保在开始尝试剥离标记之前对数据进行规范化。我最近参加了一个涵盖XSS过滤器规避的Web应用安全研讨会。人们通常认为搜索<&lt;或其十六进制等效值就足够了。看到幻灯片后,我看到了<可编码以超过滤镜的方式,我感到很震惊。

<强>更新

以下是我所指的演示文稿,请参阅幻灯片26,了解编码<的70种方法。

Filter Evasion: Houdini on the Wire

答案 2 :(得分:29)

这是我在谷歌上发现的。 对我而言,它运作良好。

String noHTMLString = htmlString.replaceAll("\\<.*?\\>", "");

答案 3 :(得分:11)

可能有一些,但最强大的是使用实际的HTML解析器。有一个here,如果形式合理,你也可以使用SAX或其他XML解析器。

答案 4 :(得分:11)

在将这个问题打开了将近一个星期后,我可以肯定地说,Java API或Apache库中没有可用的方法从String中删除HTML标记。您可能必须使用前面答案中描述的HTML解析器,或者编写一个简单的正则表达式来去除标记。

答案 5 :(得分:7)

使用Jsoup时,它比上面的答案更容易:

String html = "bla <b>hehe</b> <br> this is awesome simple";

String text = Jsoup.parse(html).text();

答案 6 :(得分:6)

我已经使用nekoHtml来做到这一点。它可以剥离所有标签,但它可以轻松地保留或剥离标签的子集。

答案 7 :(得分:5)

我知道这个问题已经很老了,但我也一直在寻找这个问题,而且似乎在java中找到一个好的和简单的解决方案仍然不容易。

今天我遇到了这个小函数库。它实际上试图模仿php strip_tags函数。

http://jmelo.lyncode.com/java-strip_tags-php-function/

它的工作原理如下(从他们的网站复制):

    import static com.lyncode.jtwig.functions.util.HtmlUtils.stripTags;

    public class StripTagsExample {
      public static void main(String... args) {
        String result = stripTags("<!-- <a href='test'></a>--><a>Test</a>", "");
        // Produced result: Test
      }
    }

答案 8 :(得分:3)

嗨,我知道这个帖子已经老了,但它仍然在谷歌上市,我正在寻找快速解决同样的问题。找不到任何有用的东西,所以我想出了这段代码片段 - 希望它对某人有所帮助。它只是循环遍历字符串并跳过所有标记。普通&amp;简单。

boolean intag = false;
String inp = "<H1>Some <b>HTML</b> <span style=blablabla>text</span>";
String outp = "";

for (int i=0; i < inp.length(); ++i)
{
    if (!intag && inp.charAt(i) == '<')
        {
            intag = true;
            continue;
        }
        if (intag && inp.charAt(i) == '>')
        {
            intag = false;
            continue;
        }
        if (!intag)
        {
            outp = outp + inp.charAt(i);
        }
}   
return outp;

答案 9 :(得分:3)

采用纯迭代方法,无正则表达式:

public String stripTags(final String html) {

    final StringBuilder sbText = new StringBuilder(1000);
    final StringBuilder sbHtml = new StringBuilder(1000);

    boolean isText = true;

    for (char ch : html.toCharArray()) {
        if (isText) { // outside html
            if (ch != '<') {
                sbText.append(ch);
                continue;
            } else {   // switch mode             
                isText = false;      
                sbHtml.append(ch); 
                continue;
            }
        }else { // inside html
            if (ch != '>') {
                sbHtml.append(ch);
                continue;
            } else {      // switch mode    
                isText = true;     
                sbHtml.append(ch); 
                continue;
            }
        }
    }

    return sbText.toString();
}

答案 10 :(得分:1)

由于html片段的缩写(字符串截断),我还有正则表达式无法检测到的未闭合html标记的问题。 例如:

Lorem ipsum dolor sit amet, <b>consectetur</b> adipiscing elit. <a href="abc"

所以,参考2个最佳答案(JSoup和regex),我更喜欢使用JSoup的解决方案:

Jsoup.parse(html).text()

答案 11 :(得分:0)

Wicket使用以下方法来转义html,位于:org.apache.wicket.util.string.Strings

public static CharSequence escapeMarkup(final String s, final boolean escapeSpaces,
    final boolean convertToHtmlUnicodeEscapes)
{
    if (s == null)
    {
        return null;
    }
    else
    {
        int len = s.length();
        final AppendingStringBuffer buffer = new AppendingStringBuffer((int)(len * 1.1));

        for (int i = 0; i < len; i++)
        {
            final char c = s.charAt(i);

            switch (c)
            {
                case '\t' :
                    if (escapeSpaces)
                    {
                        // Assumption is four space tabs (sorry, but that's
                        // just how it is!)
                        buffer.append("&nbsp;&nbsp;&nbsp;&nbsp;");
                    }
                    else
                    {
                        buffer.append(c);
                    }
                    break;

                case ' ' :
                    if (escapeSpaces)
                    {
                        buffer.append("&nbsp;");
                    }
                    else
                    {
                        buffer.append(c);
                    }
                    break;

                case '<' :
                    buffer.append("&lt;");
                    break;

                case '>' :
                    buffer.append("&gt;");
                    break;

                case '&' :

                    buffer.append("&amp;");
                    break;

                case '"' :
                    buffer.append("&quot;");
                    break;

                case '\'' :
                    buffer.append("&#039;");
                    break;

                default :

                    if (convertToHtmlUnicodeEscapes)
                    {
                        int ci = 0xffff & c;
                        if (ci < 160)
                        {
                            // nothing special only 7 Bit
                            buffer.append(c);
                        }
                        else
                        {
                            // Not 7 Bit use the unicode system
                            buffer.append("&#");
                            buffer.append(new Integer(ci).toString());
                            buffer.append(';');
                        }
                    }
                    else
                    {
                        buffer.append(c);
                    }

                    break;
            }
        }

        return buffer;
    }
}

答案 12 :(得分:0)

public static String stripTags(String str) {
    int startPosition = str.indexOf('<');
    int endPosition;
    while (startPosition != -1) {
        endPosition = str.indexOf('>', startPosition);
        str = str.substring(0, startPosition) + (endPosition != -1 ? str.substring(endPosition + 1) : "");
        startPosition = str.indexOf('<');
    }
    return str;
}