在previous question中,我设法为我的wiki进行了一些文本替换。哪个适用于标题。但现在我想用ID替换标题。对于我的wiki,我只需将[[wiki :: Title]]替换为该标题的链接。如何从该标题点的ID中获取链接?
以下代码有效,但只输出ID。示例文字包括[[tdh::1]]
和[[tdh::5]]
。我现在想要获取该ID并查询我的数据库并使用该结果来构建链接。
$text = preg_replace("/\[\[tdh::(.+?)\]\]/","<a href=\"*page here*?task=tdhelp&action=read&id=\\1\">\\1</a>", $text);
指出我正确的方向会很有帮助。感谢。
答案 0 :(得分:2)
您可以使用preg_replace_callback
和callback
参数使用一个使用该ID从数据库中获取名称的函数。
请注意,上述方法虽然简单,但可能会导致大量数据库调用。一种改进是首先使用preg_match_all
查找所有ID并将它们存储在一个数组中。然后,您可以在单个数据库调用中获取所有名称。你需要的SQL将是这样的:
SELECT id, name
FROM links
WHERE id IN (?, ?, ?)
如果您不使用参数化查询,请注意SQL注入漏洞。将结果存储在关联数组中,其中ID为键,名称为值。
最后,您可以使用preg_replace_callback
,其中回调函数从数组中找到名称。
答案 1 :(得分:1)
首先应该从数据库中读取id和任何其他必要的关联,并将它们缓存在某种数组中。
您根据缓存的数据使用preg_replace_callback
来实际替换。
或者你可以分两步:尝试一次并记录找到的id(不是替换)。使用这些来查询数据库以获取其他数据。进行另一次搜索并替换结果。
您也可以执行@Mark建议的操作,但如果您正在编辑的页面有15个标题,您将对数据库进行15次查询,这可能对您有效。在某些高负荷下,它可能无法正常工作。这通常意味着慢速页面。