mysql查询基于preg_match或preg_replace中的字符串?

时间:2011-01-09 19:06:30

标签: php preg-replace preg-match

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);

指出我正确的方向会很有帮助。感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用preg_replace_callbackcallback参数使用一个使用该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次查询,这可能对您有效。在某些高负荷下,它可能无法正常工作。这通常意味着慢速页面。