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

如何使用preg_replace实现Markdown转HTML时忽略<code>标签内的内容

解决Markdown转HTML时忽略<code>标签内内容的问题

这个场景我之前处理过,直接用单一的preg_replace会把<code>标签里的Markdown语法也一并转换,破坏了代码块的原始内容。我们可以通过暂存代码块内容→处理外部文本→恢复代码块的三步思路来解决:

具体实现步骤

  • 第一步:把所有<code>标签(包括带属性的)里的内容提取出来,用唯一占位符替换,同时保存到数组中
  • 第二步:对剩下的文本执行你原来的**转<b>**的替换操作
  • 第三步:把占位符替换回原来的<code>标签内容

PHP代码示例

function markdownToHtml($text) {
    // 1. 暂存code标签内容
    $codeBlocks = [];
    $text = preg_replace_callback(
        '/<code[^>]*>(.*?)<\/code>/s',
        function($matches) use (&$codeBlocks) {
            $index = count($codeBlocks);
            $codeBlocks[$index] = $matches[0]; // 保存完整的code标签内容
            return "{CODE_BLOCK_$index}"; // 替换为占位符
        },
        $text
    );

    // 2. 处理外部的**转<b>
    $text = preg_replace("/\*\*(.+?)\*\*/s", "<b>$1</b>", $text);

    // 3. 恢复code标签内容
    foreach ($codeBlocks as $index => $block) {
        $text = str_replace("{CODE_BLOCK_$index}", $block, $text);
    }

    return $text;
}

// 测试示例输入
$input = '**hello** <code class="language-c"> **hello** </code>';
$output = markdownToHtml($input);
echo $output;
// 输出结果:<b>hello</b> <code class="language-c"> **hello** </code>

代码说明

  • preg_replace_callback用来匹配所有带属性的<code>标签,比如<code class="language-c">这种情况也能正确捕获
  • 占位符用{CODE_BLOCK_$index}这种唯一标识,避免和文本中其他内容冲突
  • 最后遍历数组把占位符替换回原始的<code>标签,保证代码块内容完全不受处理影响

内容的提问来源于stack exchange,提问作者Lpkr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:29:05