2011-01-09 67 views
2

previous question中,我設法爲我的wiki獲得了一些文本替換工作。這對於標題非常有用。但現在我想用ID替換標題。對於我的維基,我只需將[[wiki :: Title]]替換爲該標題的鏈接即可。我怎樣才能從該標題點的ID中獲得鏈接?基於preg_match或preg_replace中的字符串的Mysql查詢?

下面的代碼工作,但只輸出ID。示例文本包括[[tdh::1]][[tdh::5]]。我現在想採用該ID並查詢我的數據庫並使用該結果來建立鏈接。

$text = preg_replace("/\[\[tdh::(.+?)\]\]/","<a href=\"*page here*?task=tdhelp&action=read&id=\\1\">\\1</a>", $text); 

指引我在正確的方向將是有益的。謝謝。

回答

2

您可以使用preg_replace_callbackcallback參數使用一個函數,該函數使用ID從數據庫中提取名稱。

請注意,上述方法雖然簡單,但可能會導致大量數據庫調用。一個改進是首先使用preg_match_all找到所有ID並將它們存儲在一個數組中。然後,您可以在單個數據庫調用中獲取所有名稱。您需要的SQL將如下所示:

SELECT id, name 
FROM links 
WHERE id IN (?, ?, ?) 

如果不使用參數化查詢,請注意SQL注入漏洞。將結果存儲在ID爲關鍵字和名稱爲值的關聯數組中。

最後,您可以使用preg_replace_callback其中回調函數從數組中找到名稱。

+0

Upvoted因爲你有更多的實際使用方法的指針:)。 – 2011-01-09 19:20:22

+0

現在就開始工作,馬上回來一些結果。 – Bryan 2011-01-09 19:24:44

1

您應該先讀取數據庫中所需的id和任何其他關聯,並將它們緩存在某種數組中。

您使用preg_replace_callback來根據緩存的數據進行實際替換。

或者,您可以分兩步進行:嘗試一次並記錄找到的id(而不是替換)。使用這些查詢數據庫以獲取更多數據。做另一個搜索並替換結果。

你也可以做@Mark建議的內容,但是如果你正在編輯的頁面有15個標題,那麼你將會對db進行15個查詢,這可能對你有用或者不適用。在一些高負荷下它可能不起作用。這意味着通常頁面放緩。

相關問題