2010-09-24 65 views
1

我使用這個模式刪除所有的HTML標籤(Java代碼):如何讓HTML標籤中指定

String html="text <a href=#>link</a> <b>b</b> pic<img src=#>"; 
html=html.replaceAll("\\<.*?\\>", ""); 

System.out.println(html); 

現在,我想保持標籤<a ...>(與</a>)和標籤<img ...>

我想要的結果是:

text <a href=#>link</a> b pic<img src=#> 

如何做到這一點?


我不需要HTML解析器要做到這一點,

,因爲我需要這個正則表達式來篩選大量的HTML代碼片段,

所以,我想用正則表達式

解決方案
+0

這可能是跑題了,但你有HTML的例子是無效的 - 你也可以看到從事實上它把SO的語法高亮顯示出來...... – teukkam 2010-09-24 09:25:03

+0

它們完全有效。 HTML不需要引用屬性值,也不需要作者關閉'img'標籤(等等)。 – 2010-09-24 09:33:30

回答

3

可以做到這一點使用負前瞻:

"<(?!(?:a|/a|img)\\b).*?>" 

Rubular

但是,這有一些問題,我會建議,而不是如果你想有一個強大的,你使用的HTML解析器解。

欲瞭解更多信息,請參見該問題:

+0

謝謝,我嘗試了模式'html = html.replaceAll(「<(?!(?: a |/a | img)\ b)。*?>」,「」);'但是什麼也沒有發生 – Koerr 2010-09-24 09:39:53

+0

在Java你需要逃避反斜槓。我已經覈實了我的帖子。 – 2010-09-24 11:12:33

+0

如果你要運行這麼多次,我建議你預編譯模式:private static final Pattern regex = Pattern.compile(「<(?!(?: a |/a | img)\\ b )。*?>「) – WhyNotHugo 2012-05-10 20:45:25

0

看看這個了http://sourceforge.net/projects/regexcreator/。這是非常方便的gui regex編輯器。

+0

謝謝,我可以運行這個編輯器,但我不知道如何爲我的問題創建正則表達式模式,我的正則表達式很糟糕。 – Koerr 2010-09-24 09:27:47

0

使用適當的HTML解析器,例如htmlparserJerichovalidator.nu HTML parser。然後使用解析器的API,SAX或DOM來抽出你感興趣的東西。

如果你堅持使用正則表達式,你幾乎肯定會犯一些小錯誤,導致破損,並可能進行跨站腳本攻擊,具體取決於您使用標記進行的操作。請參閱this answer

-1

我推薦你用用strip_tags(PHP函數)

string strip_tags (string $str [, string $allowable_tags ]) 

    <?php 
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>'; 
echo strip_tags($text); 
echo "\n"; 

// Allow <p> and <a> 
echo strip_tags($text, '<p><a>'); 
?> 

輸出

Test paragraph. Other text 
<p>Test paragraph.</p> <a href="#fragment">Other text</a> 
+0

如何使用PHP函數...當它的Java問題? – 2011-11-04 10:27:58