You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 15:14:59