2011-09-08 24 views
5

我想從字符串中刪除HTML標記。 這是很容易的,我知道,我這樣做:使用RegExp和Java刪除一些HTML標記

public String removerTags(String html) 
    { 
     return html.replaceAll("\\<(/?[^\\>]+)\\>", " ").replaceAll("\\s+", " ").trim(); 
    } 

的問題是,我不希望刪除所有的標籤..我想在標籤字符串中

<span style=\"background-color: yellow\"> (text) </ span> 

保持不變..

我用這作爲一種在尋找使用GWT我在做一個Web應用程序「亮點」的...

,我需要做到這一點,因爲如果搜索發現TE包含一些HTML標記的xt(索引由Lucene完成),並且被破壞,safeHTMLBuilder的appendHTML無法掛載String。

你可以用相當好的方式做到這一點?

擁抱。

+1

這些問題是很常見的這些天。爲什麼我們不能將類似的問題聚集在一起*#SO提示*;) –

+0

這是真正的男人。 – caarlos0

+0

確保您也考慮實體參考值。 – Edward

回答

4

我強烈建議您爲此任務使用JSoup。正則表達式根本不適合這項任務。與JSoup這基本上是一個簡單,易讀,易於維護的單線!

看一看的JSoup.clean方法,也許這篇文章:

+0

這將刪除我所有的HTML標記。 – caarlos0

+0

噢,不......你可以給該方法提供一個你不想讓它干擾的白名單標籤。 – aioobe

+0

嗯,我會嘗試... – caarlos0

0

我已經習慣在這偉大的效果庫是OWASP AntiSamy

這肯定允許標記的白名單/黑名單。這可能值得一看。

+0

jsoup似乎更好.. – caarlos0

+0

謝謝,下次我需要做這種事情時,我會記住這個庫房。 – extorn

1

我發現僅使用正則表達式這個問題的解決方案:

public static String filterHTMLTags(String html) { 

    // save valid tags: 
    String striped = html.replaceAll("(?i)\\<(\\s*/?(a|h\\d|b|i|em|cite|code|strong|pre|br).*?/?)\\>", "{{$1}}"); 
    // remove all tags: 
    striped = striped.replaceAll("\\<(/?[^\\>]+)\\>", " "); 
    // restore valid tags: 
    striped = striped.replaceAll("\\{\\{(.+?)\\}\\}", "<$1>"); 

    return striped; 
} 

確保您請勿使用「{{...}}」在你的HTML內容。您可以輕鬆更改此「保存順序」。有效代碼是在第一的replaceAll正則表達式的列表中定義:

(| H \ d | B | I | EM |舉|代碼|強|預|的BR)

的上面列表中的「h \ d」表示「h1,h2,...」是有效的標籤。

我使用此代碼測試這樣的:

public static void main (String[] args) { 

    String teste = " <b>test bold chars</b> <BR/> <div>test div</div> \n" + 
      " link: <a href=\"test.html\">click here</a> <br />\n" + 
      " <script>bad script</script> <notpermitted/>\n"; 

    System.out.println("teste: \n"+teste); 
    System.out.println("\n\n\nstriped: \n"+filterHTMLTags(teste)); 
} 

再見, 塞爾吉奧·菲格雷多 - My blog