2010-04-01 109 views
0

好的,我一直在通過一組字符串替換bbcode樣式標籤在我的論壇中,取代[b][i]等是相當簡單的,因爲我可以直接替換它們而沒有問題。bbcode樣式標籤與preg

有兩個標籤給我帶來了問題,因爲我需要對它們做更復雜的處理。 [quote][url]都很好,但是,我想給用戶選擇[quote=person_to_quote][url=URL]link text[/url][quote=]標籤也需要能夠嵌套!

所以我需要能夠替換開始標記[quote=然後保留字符串添加]顯示報價然後結束[/quote]。我可以更換批發標籤並保留=person的罰款,但這是由我作弊和簡單地添加結束標籤的文本。我真的很想能夠做的就是將=]之間的所有內容都存儲起來,以便我可以單獨處理它。

目前我使用一個數組,simplye從而取代了嵌入式文本:

"[quote=" is replaced by "<span class=\"quote\">[Quote: ", 

,只是拍着非替換文本回到它的結束,這是醜陋的,但。我希望能夠做的就是把代碼說[quote=person]some text here[/quote],使之成爲:

"[quote=" is replaced by "<span class=\"quote\">$person says: ", 

其中$的人會存儲這個人的名字,因此它可以被動態替換的變量。

與網址

同樣地,我想更換[url=link]link text[/url],使之能夠接受的URL和內嵌更換所以輸出:

"[url=" is replaced by "<a href=$URL>" 

與HTML標籤已經關閉,這意味着剝離url出來,存儲它然後替換它之後。

那麼,我用什麼方法來刪除=和關閉]標籤之間的文本,所以我傳入替換數組可以傳遞出來,並相應地修改。另外,我並不擔心嵌套在quotes中,因爲span類樣式會照顧到這一點,但是我確實需要一個可以處理任意數量的引號標籤的函數!請仔細閱讀。

編輯:

只是一個更新,我已經解決了我想做的事情,我修改了代碼webbiedave給了我和它的工作原理:

$output = preg_replace_callback(
'/\[quote=([^\]]+)?\]/', 
create_function(
'$matches', 
'return \'<span class="quote">\'.$matches[1].\' says: \';' 
), 
$comment); 

然後關閉標籤回升無論如何,通過我的普通標籤替換搜索。

回答

2

嘗試preg_replace_callback

$output = preg_replace_callback(
     '/\[quote=([^\]]+)?\]([^\[]+)?\[\/quote\]?/', 
     create_function(
      '$matches', 
      'return \'"[quote=" is replaced by "<span class=\"quote\">\'.$matches[1].\' says: ",\';' 
     ), 
     '[quote=person]some text here[/quote]' 
    ); 
+0

嗯,如果我讀的是正確的替換整個配對標籤?輸出很好,因爲它給了我一個跨度類,但它不需要搜索結束標記?由於兩個標籤都被替換,它正在改變嵌套,並且它不能在嵌套引號上工作。結束標籤可以替換爲第二遍,因此不需要包含。所以我需要改變它,只用'替換'[quote = chris]'部分Chris說
'爲結束標記添加另一個替換將會消除嵌套問題。 – TooManyCooks 2010-04-01 16:43:02

+0

啊,謝謝,我讀的時候有點不對,它正在搜索標籤之間的文本,但沒有替換結束標籤,我已經採取了一些措施並修改了它。但在正確的方向點+1! – TooManyCooks 2010-04-01 16:57:45

+0

很高興我能幫到你。我只想說明如何使用這個函數來解決你的問題,而不是給你一個完整的解決方案。 – webbiedave 2010-04-01 16:59:35