如何使用正则将被HTML包裹的Markdown代码块转为标准HTML代码块?
优化被
<p>包裹的Markdown代码块转换方案 你可以通过优化正则表达式+String.replace函数式替换的方式,替代手动遍历的实现,代码更简洁优雅:
核心实现代码(兼容Google Apps Script)
function convertWrappedCodeBlocks(inputText) { // 正则匹配:捕获语言标识 + 中间所有被<p>包裹的代码行 const codeBlockRegex = /<p>```(\w*)<\/p>([\s\S]*?)<p>```<\/p>/g; return inputText.replace(codeBlockRegex, function(match, lang, wrappedCode) { // 清理代码内容:去掉首尾的<p>/</p>,将段落分隔符替换为换行 const cleanCode = wrappedCode .replace(/^<p>|<\/p>$/g, '') .replace(/<\/p><p>/g, '\n'); // 生成标准HTML代码块 return `<pre><code language="${lang}">${cleanCode}</code></pre>`; }); } // 测试示例 const testInput = '<p>```python</p><p>def fn():</p><p> pass</p><p>```</p>'; console.log(convertWrappedCodeBlocks(testInput)); // 输出:<pre><code language="python">def fn():\n pass</code></pre>
关键优化点
正则表达式优化:
- 用
([\s\S]*?)非贪婪匹配任意字符(包括换行),解决原正则只能捕获单行代码的问题,完整覆盖所有被<p>包裹的代码行 (\w*)精准捕获代码块的语言标识(如python、javascript)
- 用
函数式替换:
- 利用
String.replace的回调函数特性,直接对每个匹配到的代码块进行处理,无需手动维护索引和循环替换,逻辑更清晰
- 利用
可选增强:HTML特殊字符转义
如果代码中包含<、>、&等HTML特殊字符,建议添加转义逻辑避免页面渲染异常:
function escapeHtml(str) { return str .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"'); } // 在生成代码块时替换为: return `<pre><code language="${lang}">${escapeHtml(cleanCode)}</code></pre>`;
内容的提问来源于stack exchange,提问作者SleekEagle
相关产品推荐
相关产品推荐

