2012-08-22 69 views
0

好吧,我有一個字符串,如下所示:PHP的preg_replace需要改進

$disallowedBBC = 'abbr|acronym|anchor|bdo|black|blue|br|color|email|flash|font|ftp|glow|green|html|hr|img|iurl|li|list|ltr|url|quote'; 

而不是實際的字符串preg_replace$message變量)應該擺脫所有的英國廣播公司代碼,根據不準$disallowedBBC變量:

$message = preg_replace("/\[($disallowedBBC)[^]]*](.*?)\[\/($disallowedBBC)\]/is", "$2", $message); 

但是,出於某種原因,該[hr]標籤越來越過去,這的preg_replace。所以,在這種情況下:

$message = '[hr]Test'; 

它輸出[hr]標籤,而應該將其刪除。我的正則表達式有什麼問題?

基本上...

,使其完全刪除所有[HR]和/或[HR]測試[/小時]如何改變呢?但也需要擺脫其中某些Url [/ url]的實例。它應該從一個字符串中刪除[color=red]如下:[color=red]Testing

例如,它需要擺脫[{tag}],如果它有一個關閉標籤[/{tag}],但如果沒有關閉標籤,它需要擺脫打開標籤,反之亦然。它應該能夠捕捉{}標籤內,任何位於括號內爲好,如:[quote author=Solomon time=7834783470]Just a quote here[/quote] Additional text here...

所以,這應該輸出:Just a quote here Additional text here...

+0

[^]應該是[^ \\] – walrii

+3

你正則表達式匹配'[小時]測試[/小時]'而不是'[小時]測試' – xdazz

+0

這並沒有改變任何東西,仍然沒有擺脫[hr]標籤。 –

回答

0

我認爲你需要兩個preg_replaces。一,首先擺脫對[HR] ... [/小時],然後第二擺脫任何剩餘的[HR]的...

$message = preg_replace("/\[($disallowedBBC)[^\]]*](.*?)\[\/($disallowedBBC)\]/is", "$2", $message); 
$message = preg_replace("/\[($disallowedBBC)[^\]]*]/is", "", $message); 

我嘗試做一個一步,那麼諸如「abc [bla] blahblah [hr] gak [/ hr] def」之類的東西就會變成「abcdef」。如果你可以對blahblah部分設置限制,你也許可以做到。

你可以,當然,這些組合成一個的preg_replace調用使用數組語法(但請記住,爲了事項):

$patterns = array("/\[($disallowedBBC)[^\]]*](.*?)\[\/($disallowedBBC)\]/is", 
        "/\[($disallowedBBC)[^\]]*]/is",); 
$replacements = array("$2", ""); 
$message = preg_replace($patterns, $replacements, $message); 
+0

你的例子需要:'[hr] Test'並輸出'hrTest',但應該只輸出:'Test' FYI:我在最後更新了我的問題。此外,感謝您的幫助到目前爲止:) –

+0

我明白了爲什麼。我改變了第二個替換字符串(我沒有想到)。 – walrii

+0

謝謝,這個作品完美!非常感謝! –