如何使用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
相关产品推荐
相关产品推荐

