用 130 行写一个够用的 Markdown 渲染器
后台的 Markdown 渲染器是自己写的,大约 130 行,没有引入任何第三方库。
核心原则:先转义,再渲染
顺序错了就是 XSS 漏洞。所以整个流程是:
- 先把围栏代码块抽出来放进占位数组(此时不转义)
- 对剩余全文做
htmlspecialchars - 再识别标题、列表、引用、行内样式
- 最后把转义好的代码块填回占位符
$md = preg_replace_callback('/
(\w)\n?(.?)
/s', function ($m) use (&$blocks) {
$blocks[] = '<pre><code>' . e($m[2]) . '</code></pre>';
return "\n\x01BLOCK" . (count($blocks) - 1) . "\x01\n";
}, $md);
$md = e($md); // 转义发生在抽取之后
支持范围
| 语法 | 结果 |
|---|---|
| ## 标题 | h2 |
| 粗体 | strong |
| ` 代码 ` | code |
| > 引用 | blockquote |
| - 列表 | ul |
刻意不做的功能:表格、脚注、HTML 内嵌。渲染器越小,越不容易出错。