2011-08-19 135 views
1

我一直在這裏停留一段時間。PHP刪除標題標籤內的所有段落標籤

我有這個字符串(有前後H2標籤更多內容):

...<h2 style='line-height: 44px;'><p>Lorem Ipsum</p></h2>... 

什麼正則表達式做我用它來刪除所有< P>和</p>標記的標題標籤內?

我試圖做這樣的事情,但正回顧後一個不工作:

// for the starting <p> tag 
$str = preg_replace('/(?<=<h[1-6]{1}[^>]+>)\s*<p>/i', '', $str); 
// for the ending </p> tag 
$str = preg_replace('/<\/p>\s*(?=<\/h[1-6]{1}>\s*)/i', '', $str); 

這不考慮段落標記深< H2內的文本里面>標籤

[更新]

這是從PeeHaa建議的環節之一衍生

// for the starting <p> tag 
$str = preg_replace("#(<h[1-6].*?>)<p.*?>#", '$1', $str); 
// for the ending </p> tag 
$str = preg_replace("#<\/p>(<\/h[1-6]>)#", '$1', $str); 
+3

_Don't_使用正則表達式,處理HTML。爲此,請使用解析器,如DOM。 – KingCrunch

+0

是的,我知道DOM是理想的,但對於這個例子,我沒有選擇在PHP中這樣做。此外,這裏的段落標籤會自動添加(WordPress),所以它們總是像這樣,我需要刪除它們。 –

+0

PHP也知道DOM(以及其他一些XML解析器);) – KingCrunch

回答

2

你不應該試圖解析HTML與正則表達式,但話說回來,因爲這是HTML的一個子集,而不是一個完整的文檔/嵌套佈局,它是可能的:

preg_replace('/(<h([1-6])[^>]*>)\s?<p>(.*)?<\/p>\s?(<\/h\2>)/', "$1$3$4") 

測試案例在這裏:

http://codepad.org/oA2rtNP9

+0

更好。用於測試用例並將其分爲1行。正是我需要的。 –

1

PHP Parse HTML code

Parse Website for URLs

php - parse html page

和許多許多許多人(我可以加100+以上)。

基本上就是:

不要試圖用正則表達式解析HTML。 HTML不是一種常規語言。

爲此使用HTML解析器。

例如:http://php.net/manual/en/book.dom.php

+0

是的我知道這一點,但對於這個例子我沒有選擇在PHP中這樣做。此外,這裏的段落標籤會自動添加(WordPress),所以它們總是像這樣,我需要刪除它們。 –

+0

@Jami:好笑。這就是他們都說的:)確定使用正則表達式,並等待事情咬你屁股。 :) – PeeHaa

+0

html /非嵌套代碼的子集可以用正則表達式部分解析。雖然通常是錯誤的,但是:p – sg3s