PHP自定义短代码实现:替换[item=###]为数据库关联链接
纯PHP自定义短代码:提取与批量替换方案
1. 提取所有[item=###]格式的商品ID
用正则表达式匹配所有符合格式的短代码,同时提取内嵌的商品ID,并且去重以避免重复查询数据库:
$textarea = "a long list of text [item=23] within a large text string<br>And more stuff [item=35]"; // 匹配所有[item=数字]格式的短代码,捕获数字ID preg_match_all('/\[item=(\d+)\]/', $textarea, $matches); // 提取唯一的商品ID数组 $itemIds = array_unique($matches[1]);
2. 批量查询商品名称
基于提取到的唯一ID,批量查询数据库(以PDO为例,确保SQL安全),构建ID与商品名称的映射数组:
// 假设已初始化PDO连接实例$pdo if (!empty($itemIds)) { // 生成对应数量的占位符,防止SQL注入 $placeholders = implode(',', array_fill(0, count($itemIds), '?')); $stmt = $pdo->prepare("SELECT id, name FROM items WHERE id IN ($placeholders)"); $stmt->execute($itemIds); // 构建ID => 商品名称的映射数组 $itemMap = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $itemMap[$row['id']] = $row['name']; } }
3. 批量替换短代码
使用preg_replace_callback遍历所有匹配的短代码,根据映射数组替换为对应的商品链接:
// 执行替换逻辑 $processedText = preg_replace_callback('/\[item=(\d+)\]/', function($match) use ($itemMap) { $itemId = $match[1]; // 存在对应商品则生成链接,否则保留原短代码避免异常 if (isset($itemMap[$itemId])) { return "<a href=\"/item?id={$itemId}\">{$itemMap[$itemId]}</a>"; } return $match[0]; }, $textarea); // 输出处理后的文本 echo $processedText;
核心优势
- 仅执行一次数据库查询,避免重复查询的性能损耗
- 用占位符处理SQL查询,彻底规避SQL注入风险
- 自动兼容不存在的商品ID,保留原短代码避免页面显示异常
内容的提问来源于stack exchange,提问作者Jabbamonkey
相关产品推荐
相关产品推荐

