簡體   English   中英

Java從沒有正則表達式的String中刪除HTML

[英]Java remove HTML from String without regular expressions

我試圖從String中刪除所有HTML元素。 不幸的是,我不能使用正則表達式,因為我在Blackberry平台上開發並且還不支持正則表達式。

有沒有其他方法可以從字符串中刪除HTML? 我在某處讀過你可以使用DOM Parser,但我找不到太多東西。

帶HTML的文字:

<![CDATA[As a massive asteroid hurtles toward Earth, NASA head honcho Dan Truman (<a href="http://www.netflix.com/RoleDisplay/Billy_Bob_Thornton/20000303">Billy Bob Thornton</a>) hatches a plan to split the deadly rock in two before it annihilates the entire planet, calling on Harry Stamper (<a href="http://www.netflix.com/RoleDisplay/Bruce_Willis/99786">Bruce Willis</a>) -- the world's finest oil driller -- to head up the mission. With time rapidly running out, Stamper assembles a crack team and blasts off into space to attempt the treacherous task. <a href="http://www.netflix.com/RoleDisplay/Ben_Affleck/20000016">Ben Affleck</a> and <a href="http://www.netflix.com/RoleDisplay/Liv_Tyler/162745">Liv Tyler</a> co-star.]]>

沒有HTML的文字:

當一顆巨大的小行星撞向地球時,美國國家航空航天局局長丹·杜魯門(比利鮑勃桑頓)制定了一項計划,在將整個行星殲滅之前將致命的岩石分成兩部分,呼吁哈利·斯坦克(布魯斯·威利斯) - 世界上最好的石油鑽探者 - 領導任務。 隨着時間的推移,Stamper匯集了一支精干的團隊並向太空發起沖擊,試圖進行危險的任務。本阿弗萊克和麗芙泰勒共同出演。

謝謝!

在野外解析HTML有很多細微差別,其中一個更有趣的方法就是許多頁面都沒有遵循任何標准。 這就是說,如果你的所有HTML都像你的例子一樣簡單,那么這樣就足夠了:

    char[] cs = s.toCharArray();
    StringBuilder sb = new StringBuilder();
    boolean tag = false;
    for (int i=0; i<cs.length; i++) {
        switch(cs[i]) {
            case '<': if ( ! tag) { tag = true; break; }
            case '>': if (tag) { tag = false; break; }
            case '&': i += interpretEscape(cs, i, sb); break;
            default: if ( ! tag) sb.append(cs[i]);
        }
    }
    System.err.println(sb);

其中interpretEscape()應該知道如何轉換HTML轉義,例如&gt; 他們的角色對應物,並跳過所有角色直到結尾;

我無法使用正則表達式,因為我正在Blackberry平台上進行開發

您不能使用正則表達式,因為HTML是一種遞歸語言,而正則表達式無法處理這些語法。

你需要一個解析器。

如果你可以添加外部jar,你可以嘗試使用這兩個小庫:

他們都允許你去除一切。

我多次使用jericho,剝離你定義一個你喜歡的提取器:

class HTMLStripExtractor extends TextExtractor
{
    public HTMLStripExtractor(Source src)
    {       
        super(src)  
        src.setLogger(null)
    }

    public boolean excludeElement(StartTag startTag)
    {
        return startTag.getName() != HTMLElementName.A
    }
}

我試圖以相反的方式解決這個問題,從HTML創建一個DOM樹,然后從樹中提取字符串:

  • 使用像TagSoup這樣的庫來解析HTML,同時將其清理為接近XHTML。
  • 當您正在流式傳輸已清理的XHTML時,請提取所需的文本。

暫無
暫無

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

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