2011-01-09 88 views
2

我想刪除字符串中的所有HTML內容,除了一個div類:<div class="toto">blablabla</div>刪除所有的HTML標籤和內容除了一個div類

我應該使用正則表達式或DOM解析器?

要回答drachenstern:

這是評論內容與設置高亮。 而這個div中的html是用Geshi(代碼高亮)生成的,所以我不想刪除它。

例如,訪問者可以在[code][/code]bbcode標籤中輸入<script></script>[code][/code] bbcode標籤之外的所有HTML必須刪除否?

回答

1

這是almost impossible to use a Regex to successfully extract data from a webpage所以我建議改爲使用dedicated HTML parser。有些問題只是爲了讓您每次嘗試解決它們,因此use an external library被認爲是可以接受的。

如果你只需要一個div,我想知道你想用特定的div做什麼。它可以在客戶端工作,還是必須在服務器端進行?你想寫一個刮板嗎?

+0

這是評論內容與設置高亮。而這個div中的html是用Geshi(代碼高亮度)生成的,所以我不想刪除它。例如,訪問者可以在[code] [/ code] bbcode標籤中輸入,但不能在外面。對不起,我的英語不好:/ – CrazyMax 2011-01-09 06:37:32

+0

你的英語不錯,而且我還不完全確定問題是什麼。您是否在表單文章上過濾輸入,並在將元素返回到頁面之前嘗試阻止XSS? – jcolebrand 2011-01-09 06:39:28

+0

是的,我使用PHP IDS來防止垃圾郵件的注入和Akismet。 – CrazyMax 2011-01-09 06:40:46

0

我想你已經知道答案了:-)

雖然嚴重......在這種情況下,依賴於周圍的串的複雜性......如果它有一個很大的差異,或者您想要的片段如果周圍的內容是相當可預測的,那麼正則表達式就可以做到。我可能會以任何方式使用DOM,因爲它會更容易使用,並且是最安全的。

0

除非你能保證字符串的這部分完全是<div class="toto".....</div>的形式,否則正則表達式不能這樣做。具體來說,我的意思是class之前主要沒有其他屬性,並且在此之內沒有其他div元素。大寫/小寫,空格和單/雙引號應該能夠由正則表達式處理。

因爲你很可能不能讓這些保障,你需要一個DOM解析器

即使你做的正則表達式工作,爲這個非常特殊的情況下,如果你是(它會如果你能成爲一個特例)在其他地方可能會發生變化或執行類似的任務,那麼DOM解析器將很快變得值得。

編輯 - 錯誤地將空格分類,固定。

0

WordPress和其他人仍然使用KSES,它似乎是一個相當靈活的過濾器 - 看看這裏:http://sourceforge.net/projects/kses/

例子:

$string = kses($string, array('div' => array('valueless' => 'n', value => 'toto'))); 
0

(我是從PHP標籤假設以下將是有用的...)

strip_tags()正是這樣做。示例代碼

<?php 
$text = '<p>Test paragraph.</p> <div class="blah">Other text</div>'; 

echo strip_tags($text, '<div>'); 
echo "\n"; 
?> 

產生輸出

Test paragraph. <div class="blah">Other text</div>