簡體   English   中英

在Java中剝離HTML標記

[英]Stripping HTML tags in Java

是否有現有的Java庫提供了從String中剝離所有HTML標記的方法? 我正在尋找與PHP中的strip_tags函數等效的東西。

我知道我可以使用這個Stackoverflow問題中描述的正則表達式,但是我很好奇是否已經有一個stripTags()方法浮動在Apache Commons庫中可以使用的某個地方。

使用JSoup ,它有很好的文檔記錄,可以在Maven上使用,經過一天的花費時間與幾個庫,對我來說,它是我能想象的最好的..我自己的意見是,這樣的工作,解析html到plain-文本,應該可以在一行代碼 - >否則庫已經以某種方式失敗...只是說^^所以這里是,JSoup的單行 - 在Markdown4J,類似的東西是不可能的,在Markdownj ,在htmlCleaner中,這有點大約50行代碼的痛苦...

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

你得到的是真正的純文本(不僅僅是作為字符串的html源代碼,就像在其他庫中一樣) - >他真的做得很好。 它與Markdownify for PHP或多或少相同的質量....

這是我在谷歌上發現的。 對我來說它工作得很好。

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

無論您做什么,請確保在開始嘗試剝離標記之前對數據進行標准化。 我最近參加了一個涵蓋XSS過濾器規避的Web應用安全研討會。 人們通常會認為搜索<&lt; 或其十六進制等效就足夠了。 我看到與70點的方式滑動后吹走<可以被編碼到打濾波器。

更新:

下面是我所指的演示文稿,請參閱幻燈片26,了解70種編碼方式<

過濾器逃避:電線上的Houdini

可能有一些,但最強大的是使用實際的HTML解析器。 有一個在這里 ,如果它是相當不錯形成,也可以使用SAX或另一個XML分析器。

在將這個問題打開將近一周之后,我可以肯定地說,Java API或Apache庫中沒有可用的方法從String中刪除HTML標記。 您可能必須使用前面答案中描述的HTML解析器,或者編寫一個簡單的正則表達式來去除標記。

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

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

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

我用過nekoHtml來做到這一點。 它可以剝離所有標簽,但它可以輕松地保留或剝離標簽的子集。

我知道這個問題已經很老了,但我一直在尋找這個問題,似乎在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
      }
    }

嗨,我知道這個帖子已經老了,但它仍然出現在谷歌的頂部,我正在尋找快速修復同樣的問題。 找不到任何有用的東西,所以我想出了這段代碼片段 - 希望它對某人有所幫助。 它只是循環遍歷字符串並跳過所有標記。 簡單明了。

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;

使用純迭代方法,沒有正則表達式:

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();
}

由於html片段的縮寫(字符串截斷),我還有正則表達式無法檢測到的未閉合html標記的問題。 例如:

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

所以,參考2個最佳答案(JSoup和regex),我更喜歡使用JSoup的解決方案:

Jsoup.parse(html).text()

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;
    }
}
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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM