Markdown 在线预览
轻量 Markdown 渲染:标题/粗斜体/代码/列表/引用/链接/图片/分隔线/表格
输出已转义 HTML 防注入,支持标题、粗体/斜体、行内代码、代码块、列表、引用、链接、图片、分隔线、表格。
Markdown 预览:支持的语法子集与不转义的差别
Markdown 没有唯一的"标准实现"
Markdown 最初由 John Gruber 用一段 Perl 脚本实现,规范描述是自然语言。这导致不同实现(GitHub、CommonMark、各编辑器)在细节上行为不同。后来 CommonMark 试图给出严格规范,GitHub 又在其上扩展出 GFM(GitHub Flavored Markdown)。
所以同一个 Markdown 文件在不同平台渲染结果可能不同。本工具实现的是常用语法的子集,定位是快速预览,不是完整渲染器。
支持的语法
| 语法 | 写法 |
|---|---|
| 标题 | # 到 ###### 开头 |
| 粗体 / 斜体 | **粗**、*斜* |
| 行内代码 | 反引号包裹 |
| 代码块 | 三个反引号围栏(或缩进) |
| 无序 / 有序列表 | - * + 或 1. |
| 引用 | > 开头 |
| 链接与图片 | [文字](url)、 |
| 分隔线 | --- 或 *** |
| 表格 | 管道符分隔,第二行写对齐标记 |
通常不支持或行为不同的部分
| 特性 | 说明 |
|---|---|
| 原始 HTML 直通 | 本工具会对输出做转义,所以直接写 HTML 标签不会渲染成元素,而会显示为文本。这与 GitHub 不同(GitHub 允许有限的 HTML) |
| 任务列表 | - [ ] 复选框是 GFM 扩展,子集实现通常按普通列表处理 |
| 删除线 | ~~文字~~ 是 GFM 扩展 |
| 脚注 | 各平台语法不一,不是核心语法 |
| 自动链接 | 裸 URL 自动变成链接是 GFM 行为,标准 Markdown 不这样处理 |
| 嵌套列表的深度 | 子集实现可能只支持有限的嵌套层级 |
| 换行行为 | 行尾加两个空格或反斜杠才换行(标准行为);GFM 里单个换行也换行。这是个常见的跨平台差异 |
"换行"那条差异最常引起困惑:在 GitHub 里写两行相邻的普通文本会显示为两行,而标准 Markdown 会合并成一行(视为同一个段落)。如果你在别处预览效果与预期不符,先检查这一条。
为什么要转义输出
工具明确说明"输出已转义 HTML 防注入"。这条设计很重要:如果 Markdown 里允许裸 HTML 直通,那么 <script> 之类的标签就会被浏览器执行——这是几乎所有 Markdown 渲染漏洞的根源(用户提交的内容被当成代码执行)。
三个层次的防护,安全性递增:
| 做法 | 安全性 |
|---|---|
| 允许 HTML 直通 | 最危险,等于开放 XSS |
| 转义所有 HTML(本工具的做法) | 安全,但用户无法插入自定义 HTML |
| 白名单过滤(如 DOMPurify) | 既允许部分 HTML 又安全,需要在渲染后做净化 |
所以在自己的项目里渲染用户提交的 Markdown,一定要做转义或白名单净化,不要直接把渲染结果插入 DOM。这类漏洞的后果是攻击者可以在你的页面上执行任意脚本、读取用户数据。
链接与图片的实际行为
- 图片是相对路径时无法显示(预览环境没有基地址),用完整 URL 或 data URI。
- 链接点击会尝试在当前页面导航,可能离开预览。测试链接时注意,或者先用纯文本记录待验证的链接。
- 表格需要严格的对齐行(第二行的
|---|)。列数不匹配时表格可能不渲染,而显示为普通文本——这是表格"没生效"的常见原因。
工具怎么用
粘贴 Markdown 源码,点渲染,下方显示结果。适合快速检查 README、文档、笔记的排版是否符合预期,以及确认表格、代码块是否写对。全部在浏览器本地渲染,文档内容不会被上传——涉及内部文档时这一点是必要的。
最终发布前建议在目标平台再预览一次,因为各平台对扩展语法的支持不同。
常见问题
为什么链接点了没反应或变 #?
为防止 XSS,链接统一加了 rel="noopener";以 javascript: 开头的危险链接会被替换为 #。