2010-08-07 57 views
0

我在私人消息系統中啓用了嵌套引號,但是現在我想在用戶懸停郵件標題時向用戶顯示部分消息。刪除「quote」標籤之間的所有內容([quote])

要從消息中獲取相關文本,我想刪除報價部分。

的報價結構如下:

[quote] 
    [quote] 
    dasdasa adsadsa ds a 
    [/quote] 

    ddasd asd ads adsasd 
[/quote] 

如何刪除德報價標籤之間的一切嗎?

我已經用下面的代碼試過,但嵌套報價的最後部分將不刪除:

while(preg_match('#\[quote=(.*?)\](.*?)\[\/quote\]#si', $message)) { 
    $message = preg_replace('#\[quote=(.*?)\](.*?)\[\/quote\]#si', '', $message, 1); 
} 

while(preg_match('#\[quote\](.*?)\[\/quote\]#si', $message)) { 
    $message = preg_replace('#\[quote\](.*?)\[\/quote\]#si', '', $message, 1); 
} 

任何建議如何刪除這些引號出消息的?謝謝!

+2

恭喜你,你已經經歷了正則表達式不能被用來形容像非正規語言的*報價*語言。 – Gumbo 2010-08-07 11:28:59

+0

但是,由於PHP使用PCRE,而不是正則表達式,它仍然是可能的。 – NikiC 2010-08-07 11:31:54

回答

1

一)最好不要使用正則表達式...

B)使用recursion

#\[quote](?:(?>[^[])|\[(?!/?quote])|(?R))*\[/quote]# 

我沒有測試pcre,但它應該這樣做。

+0

啊,我忘了PCRE可以做遞歸匹配。 – Gumbo 2010-08-07 11:32:20

+0

您能否給我一個遞歸代碼的簡短例子?因爲我認爲這不是我在幾天內學到的東西,不是嗎? – Arjen 2010-08-07 11:39:43

0

無需撥打preg_match(),然後撥打preg_replace(),此時preg_replace()可以用一次調用替換與正則表達式匹配的所有字符串。

與正在使用正則表達式的問題是,您所報告的代碼會產生以下輸出:

ddasd asd ads adsasd 
[/quote] 
+0

完全正確。 – Arjen 2010-08-07 11:37:49