2012-06-23 78 views
6

我使用strip_tags()功能,但我需要刪除一些標籤(及其所有內容)。PHP:strip_tags - 只刪除特定標籤(及其內容)?

例如:

<div> 
    <p class="test"> 
    Test A 
    </p> 
    <span> 
    Test B 
    </span> 
    <div> 
    Test C 
    </div> 
</div> 

比方說,我需要擺脫P和SPAN標記的,只有不停:

<div> 
    <div> 
    Test C 
    </div> 
</div> 

strip_tags預計作爲第二個參數的標籤,你想要保持。

在這個特殊的例子中,我可以使用striptags($html, "<div>"); 但我刮的html和需要刪除的標籤都是不一樣的。

我搜索了一段適合我需求的功能,但找不到任何有用的功能。

任何想法的?

+2

從[DOM](http://php.net/dom)和[XPath](http://uk.php.net/manual/en/class.domxpath.php)開始 – DaveRandom

+1

問題已經在此解答: http://stackoverflow.com/questions/9788621/is-there-an-alternative-to-phps-strip-tags – Jocelyn

+0

我試圖在這篇文章中接受的答案,但不滿意的結果 – Dylan

回答

11

使用正則表達式。像這樣的東西應該工作:

$tags = array('p', 'span'); 
$text = preg_replace('#<(' . implode('|', $tags) . ')>.*?<\/$1>#s', '', $text); 

demo顯示它什麼也沒有更換所需的標籤。

請注意,您可能需要更多地調整它,例如補償標記內的空白或您的示例未顯示的其他未知數。

這裏是正則表達式來捕獲標籤帶或不帶屬性:

'#<(' . implode('|', $tags) . ')(?:[^>]+)?>.*?<\/$1>#s' 
+0

@Downvoter - 任何評論爲爲什麼我的功能答案是downvoted? – nickb

+2

謝謝,這對我的情況是完美的。我正在使用簡單的html dom解析器來抓取HTML,並且只需要一些額外的剝離。 – Dylan

+0

UPDATE:這個表達式只去掉一個標籤不帶屬性...以下似乎工作: '<。爆( '|',$標籤)「)* $文字=的preg_replace((>#' *? #s','',$ text); – Dylan

1

你說你正在使用簡單的HTML DOM(好!這是解析HTML正確的方式)。當我需要刪除標記及其內容,我做的:

$rows = $html->find("span"); 

foreach ($rows as $row) 
{ 
    $row->outertext = ""; 
} 

$html->load($html->save()); 

因爲DOM會很困惑,修改之後使整個DOM已被摺疊,然後再解析的最後一行是必需的,以便更改將永久生效(IMO,簡單HTML DOM中的錯誤)。

的簡單的HTML DOM方法比正則表達式更安全,更穩定。

相關問題