2012-10-13 79 views
1

我想製作一個所謂的文本清理器,以便我可以擺脫一些html元素而不使用strip_tags()函數。php preg_replace不識別圖案

我正則表達式是這樣的:<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>

我的代碼如下所示:

$string = "some very messy string here "; 
$pattern = '<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>'; 
$replace = ' '; 

$clean = preg_replace($pattern, $replace, $string); 

echo $clean; 

對於那些我無法理解的原因回聲返回任何內容。

謝謝您的時間

更新#1

如果你問我是否想擺脫的表裏面他們的所有內容,答案是肯定的。

+0

這段代碼的目標是什麼 - 爲什麼你想避免使用strip_tags? – AD7six

+0

Strip標籤不會刪除我想要做的表格的內容。 – Mike

+0

你最好不要使用正則表達式來僞解析html。條形標籤會剝離標籤,並且如果您想要刪除表格 - 將例程寫入遠程表格。你會得到奇怪的結果,例如:「

...
...
...」。 – AD7six

回答

4

您的正則表達式需要分隔符。例如:

$pattern = '~<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>~'; 

閱讀分隔符here

另請注意,一些HTML規範(除了XHTML外,據我所知)也允許使用大寫標籤。因此,考慮添加修飾符以便對正則表達式不區分大小寫。此外,如果開始標籤和結束標籤之間存在換行符,則刪除表格可能不起作用(因爲.默認情況下不匹配換行符)。添加DOTALL修飾符s來解決這個問題:

$pattern = '~<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>~is'; 

最後一點:爲別人指出的正則表達式的解決方案,以HTML的問題應該與鹽糧服用。嵌套表格會引起問題,正如評論。如果你知道你處理得很好的數據,這個問題可能比一般的HTML複雜得多。但要確保你的代碼至少是有效的,並且你知道所有古怪的東西,如評論中的嵌套結構和HTML字符等等。

+0

這樣做,但我認爲正則表達式的定義中有些東西被打破,因爲它不會刪除表格。 – Mike

+1

'.'默認不匹配換行符。在'i':'s'之後添加另一個修飾符。它被稱爲DOTALL修飾符,現在點也將匹配linebreaks ...我將它添加到答案 –

3

首先看看this answer。這應該從一開始就把事情做好。如果你讀過的答案後,仍然要繼續,我給你以下幾點:

I want to <em<p>>emphasize</<p>em> that it's not possible! 

試圖清理的!

+1

從技術上講,他並不試圖解析它。此外,這是甚至有效的HTML?如果是這樣,這將是什麼語義。最後你可以解決它,通過聲明在關閉'>'之前也沒有''''開始,然後多次運行替換。 –

+0

不能同意更多!但是這裏的數據看起來相當統一,我必須在這個正則表達式之間進行選擇,或者手動清理大約5000個文章,這不會很聰明或者有效。 – Mike

+1

@ m.buettner你甚至讀過我發佈的鏈接嗎?我不在乎它是否是有效的HTML,它不是客戶(不是黑客)提供有效HTML的責任。繼續,拿出一個能夠捕捉我的句子的正則表達式,我會用更復雜的句子回覆你,hrhrhr。 – aefxx