2011-01-09 71 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个查询,这可能对你有用或者不适用。在一些高负荷下它可能不起作用。这意味着通常页面放缓。

相关问题