2012-12-10 85 views
0

這是我的bbcode的報價後(12345是原始帖子的ID):PHP:如何用擴展數據(遞歸)替換bbcode-quote?

[quote=12345] ... citation ... [/quote] 

我想顯示這樣的話:

<blockquote> 
    <a href="">Username</a> at 2012-09-12 11:00 a.m. (<a href="">original</a>): 
    ... citation ... 
</blockquote> 

理念(僞) :

$bbcode_content = "[quote=12345] ... citation ... [/quote]"; 

// 1. get the $post_id 
$post_id = replace('/\[quote\=(.*?)\]/is','$1', $bbcode_content); 

// 2. select the post data from databse 
$post_obj = $DB->select("SELECT `author`, `timestamp` FROM `posts` WHERE id=".$post_id); 

// 3. build an extended bbcode tag 
$bbcode_content = "[quote post_id={$post_id} timestamp={$post_obj->timestamp} author={$post_obj->author}]"; 

// 4. bbcode to html 
$html = replace("[quote post_id=(*) timestamp=(*) author=(*)]", '<blockquote><a href="">$1</a> at '.date("Y-m-d h:i", $2).' (<a href="forum/post/$3">original</a>)', $bbcode_content); 
$html = replace("[/quote]", "</blockquote>", $html); 

問題

  1. 如何更換這個東西遞歸?也許與preg_replace_callback
  2. 我的第4點「bbcode to html」的正則表達式是什麼?

我有點困惑。你將如何解決這個問題?

在此先感謝!

+2

我只是想說,如果您的使用bbcode的目的是爲了在不引入xss漏洞的情況下允許標記,您不應該嘗試編寫自己的bbcode處理器。做正確的做法看起來很難,而且你的代碼已經充滿了安全漏洞。我想我會提到這一點,因爲如果安全性不是問題,它更容易只允許html。 – goat

+1

^^非常。你真的想爲此使用一個經過良好測試的第三方庫。有*很多*。 – Charles

+0

我會重新考慮編碼我自己的bbcode處理器。我沒有想到這會是那麼廣泛。謝謝! –

回答

1

您可以隨時使用爲您處理此問題。

+0

看起來不錯,但它不適用於每個網站空間。我想避免太多的外部軟件包。 –

+1

你真的需要它在每個網站**上工作嗎?你有兩種選擇:你可以選擇犧牲這個星球上的每個人都可以運行你的代碼的可能性,並且爲了不必解決別人已經爲你解決的問題提供方便......或者,你可以犧牲你的時間來讓你的代碼超級便攜,並可能在這個過程中失去一些頭髮。這並不是說你不能做你想做的事情,只是它從這裏變得更加複雜。我只是想節省你很多時間和精力。這很容易安裝擴展 – Sherif

+0

我知道,你是對的。我其實儘量避免使用擴展名,但你的方式似乎是一個很好的方法。我會試試看。 :) –