2009-07-23 60 views
6

,如果任何人知道一個函數從PHP中的字符串中刪除所有類我只是想知道..基本上我只想條從p標籤的所有類

<p> 

標籤,而不是

<p class="..."> 

如果是有道理的:)

回答

8

一個相當幼稚的正則表達式可能會爲你工作

$html=preg_replace('/class=".*?"/', '', $html); 

我說天真,因爲如果你的身體文本碰巧包含class =「something」出於某種原因它會失敗!如果需要的話,可以通過在角標托架標籤內查找class =「」來使它更加健壯。

+0

非常感謝,像一個魅力的作品:) – SoulieBaby 2009-07-23 10:43:54

+0

該代碼是否可以處理大寫/小寫,單/雙/不加引號,空格之間,空格之前和之後的類? – 2009-07-23 11:17:22

+0

否 - 僅限OP所指示的情況。其他任何東西都留給讀者練習:) – 2009-07-23 12:45:33

1

我會在jQuery上做這樣的事情。將其放置在頁面頁眉中:

$(document).ready(function(){ 
$(p).each(function(){ 
    $(this).removeAttr("class"); 
    //or $(this).removeclass("className"); 
}) 

});

2

也許這是你需要有點大材小用,但是,解析/驗證/潔淨HTML數據,最好的工具,我所知道的是HTML Purifier

它允許您定義的標籤,以及哪些屬性,都行;和/或哪些不是;並提供有效的/ clean(X)HTML作爲輸出。

(使用正則表達式來「解析」 HTML似乎的OK開始......然後,當你想添加特定的東西,它通常變成地獄理解/維護)

2

您加載HTML到DOMDocument類中,將其加載到simpleXML中。然後,對所有p元素執行XPath查詢,然後遍歷它們。在每個循環中,將類屬性重命名爲「killmeplease」。

完成後,將simpleXML重新輸出爲XML(順便說一句,可能會更改HTML,但通常只會更好),並且您將擁有一個HTML字符串,其中每個p都有一個「killmeplease」類。使用str_replace實際刪除它們。

例子:

$html_file = "somehtmlfile.html"; 

$dom = new DOMDocument(); 
$dom->loadHTMLFile($html_file); 

$xml = simplexml_import_dom($dom); 

$paragraphs = $xml->xpath("//p"); 

foreach($paragraphs as $paragraph) { 
    $paragraph['class'] = "killmeplease"; 
} 

$new_html = $xml->asXML(); 

$better_html = str_replace('class="killmeplease"', "", $new_html); 

或者,如果你想使代碼更簡單,但用了preg_replace糾結,你可以一起去:

$html_file = "somehtmlfile.html"; 
$html_string = file_get_contents($html_file); 

$bad_p_class = "/(<p).*(class=.*)(\s.*>)/"; 

$better_html = preg_replace($bad_p_class, '$1 $3', $html_string); 

最棘手的部分用正則表達式是他們往往如果你的p元素標籤中有一個換行符,那麼貪婪並試圖關閉它可能會導致問題。但給那些一個鏡頭。

1

HTML過濾

HTML可以是非常棘手的,因爲數百種不同的方式可以編寫代碼或格式化,以正則表達式。

HTML purifier是一個成熟的清理HTML的開源庫。我會建議在這種情況下使用它。

在HTML淨化器的配置文檔中,您可以指定應該允許的類和屬性以及淨化器在發現它們時應該執行的操作。

http://htmlpurifier.org/docs/

2
$html = "<p id='fine' class='r3e1 b4d 1' style='widows: inherit;'>";  
preg_replace('/\sclass=[\'|"][^\'"]+[\'|"]/', '', $html); 

如果你正在投入對微軟Office的出口HTML的測試,你需要比類去除但HTML Tidy更加剛剛爲Microsoft Office config flag

否則,這應該是比其他答案更安全,因爲他們有點貪婪,你不知道將使用什麼樣的封裝('")。

注:模式實際上是/\sclass=['|"][^'"]+['|"]/但是,因爲有兩個引號(")撇號('),我不得不逃離一個(\')所有出現的封裝模式。