如何隐藏PrismJS Markdown解析器输出中的Markdown标点符号?
解决PrismJS解析Markdown保留标记符号的问题
PrismJS自带的Markdown语法支持本质是语法高亮,不是用来把Markdown渲染成纯HTML的,所以它会保留*、**这些标记并给它们加高亮样式,这是预期行为。要实现你要的「只输出HTML标签、去掉原Markdown标记」的效果,有两种可行方案:
方案一:先渲染Markdown为HTML,再用Prism高亮代码块
这是更合理的分工方式——用专门的Markdown解析器处理格式渲染,让Prism专注于代码高亮:
- 引入一个轻量的Markdown解析库(比如
marked或markdown-it) - 先把你的Markdown内容解析成纯HTML
- 再调用Prism的方法高亮HTML中的代码块
示例代码:
// 假设你的Markdown内容存在这里 const mdText = `*Italic* **Bold on multiple lines** \`\`\`javascript console.log('Prism + Markdown'); \`\`\``; // 第一步:用marked解析Markdown为HTML const renderedHtml = marked.parse(mdText); // 把解析后的HTML插入页面 document.querySelector('.blog-content').innerHTML = renderedHtml; // 第二步:高亮页面中的代码块 Prism.highlightAll();
这样处理后,Markdown的格式会被正确转换成<em>、<strong>等标签,代码块也会被Prism正常高亮,完全符合你的需求。
方案二:修改Prism的Markdown语言规则
如果你一定要用Prism来处理Markdown,需要修改它的Markdown语法定义,让渲染时去掉原标记符号:
找到Prism的prism-markdown.js文件,定位到处理斜体、粗体等规则的部分,修改替换逻辑。比如原斜体规则可能是这样的:
Prism.languages.markdown = { // ...其他规则 'italic': /(?:^|[^*])(\*)(?!\1)([^*\n]+)(\1)/, // ...其他规则 };
你需要把它改成自定义的替换逻辑,比如用Prism的replace方法,只保留包裹的内容和HTML标签:
Prism.languages.markdown['italic'] = { pattern: /(?:^|[^*])(\*)(?!\1)([^*\n]+)(\1)/, replace: (match) => { const content = match.split(/\*/)[1]; return `<em>${content}</em>`; } };
同理修改粗体等其他规则,但这种方法需要维护自定义的Prism语言文件,不如方案一省心。
内容的提问来源于stack exchange,提问作者Prateek Verma
相关产品推荐
相关产品推荐

