Skip to content

GFM 扩展:表格、任务列表、删除线、扩展自动链接、tagfilter

基于 CommonMark 0.31.2 / GFM · 核于 2026-07

速查

  • GFM 定位:GitHub Flavored Markdown,CommonMark 的严格超集(基于 0.29-gfm);凡 CommonMark 支持的都支持,另加下面 5 类扩展。
  • 表格:表头行 + 必需的分隔行- 加可选 : 对齐)+ 数据行,单元格用 | 分隔;表头与分隔行的列数必须一致否则不成表;数据行列数可不同(不足补空、超出截断)。
  • 表格对齐:分隔行冒号定位——:--- 左、:---: 居中、---: 右、--- 默认。
  • 表格转义:单元格内字面竖线用 \|(或 &#124;);单元格内不能真换行,要换行用 <br>
  • 任务列表:列表项标记后加复选框 - [ ](未完成)/ - [x](已完成),在 GitHub 上可交互勾选。
  • 删除线~~文字~~规范要求两个波浪号);单个 ~ 只在 github.com 等部分实现生效,跨平台统一用 ~~
  • 扩展自动链接裸写http:///https:///www. URL 与邮箱无需尖括号即自动成链,并智能剔除末尾标点(如句号、逗号)。
  • 禁用原始 HTML(tagfilter):转义 9 个风险标签的起始 <&lt;——titletextareastylexmpiframenoembednoframesscriptplaintext;仅一层,GitHub 另有后处理清洗。
  • 不属于 GFM 的常见误区:脚注、标题自定义 ID、定义列表、==高亮==~下标~/^上标^:emoji:不在 GFM 规范内(属其它处理器或 GitHub 平台特性)——详见 方言差异页

一、GFM 与 CommonMark 的关系

GFM 官方规范开宗明义:「GFM 是 CommonMark 的严格超集(strict superset)」。这意味着——所有 CommonMark 语法在 GFM 里行为一致,GFM 只是在其之上追加了若干扩展。这些扩展(本页逐一讲)是:表格、任务列表、删除线、扩展自动链接、禁用原始 HTML。GFM 规范本身基于 CommonMark 0.29-gfm

二、表格(Tables)

GFM 表格由三部分组成:表头行、紧接其下的分隔行、以及若干数据行,各单元格用竖线 | 分隔(首尾竖线可选):

md
| 语法 | 含义     | 备注     |
| ---- | -------- | -------- |
| `#`  | 标题     | 1-6 级   |
| `>`  | 引用     | 可嵌套   |

规则要点:

  • 分隔行是必需的,由 - 构成、可加 : 表示对齐;它的单元格数必须与表头一致,否则整体不被识别为表格。
  • 对齐由分隔行冒号位置决定::--- 左对齐、:---: 居中、---: 右对齐、---(无冒号)默认。
  • 数据行的列数可以与表头不同:不足则右侧补空单元格,超出的单元格被丢弃(这与「表头/分隔行必须匹配」是两回事)。
  • 单元格内的字面竖线要转义成 \|(或用实体 &#124;);单元格内不能包含真正的换行,需要换行用 <br>。单元格内可用行内格式(链接、code、强调),但不能放标题/引用/块级元素。

三、任务列表(Task list items)

在普通列表项的标记后面加一个方括号复选框即可,[ ](空格)表示未完成、[x] 表示已完成,在 GitHub 上会渲染成可交互勾选的复选框:

md
- [x] 已完成的任务
- [ ] 待办任务
- [ ] 另一个待办

四、删除线(Strikethrough)

删除线用两个波浪号包裹:

md
~~这段文字被划掉~~

一个易混点:GFM 规范定义的是「两个波浪号」;虽然 github.com 的实现放宽到单个 ~ 也能触发删除线,但那是实现层的额外宽松,GitLab、VS Code 等许多解析器只认 ~~。因此为跨平台可移植性,应统一用双波浪号 ~~。(注意:单个 ~ 在 Pandoc 等处理器里可能被当作下标语法,语义完全不同。)

CommonMark 的自动链接必须用尖括号 <...> 包住 URL;GFM 的扩展自动链接更省事——裸写的地址也会被自动识别成链接:

  • http://https:// 开头的 URL;
  • www. 开头的地址(扩展 www 自动链接);
  • 形如 user@example.com 的邮箱(扩展邮箱自动链接)。

它还会做末尾标点智能修剪:URL 后紧跟的句号、逗号、感叹号、问号等标点不会被算进链接,成对的括号也会被正确匹配。例如正文里直接写 访问 https://commonmark.org。 时,末尾的句号不会被吞进链接。

六、禁用原始 HTML(Disallowed Raw HTML / tagfilter)

行内元素页所述,Markdown 默认透传原始 HTML 会带来安全风险。GFM 的 tagfilter 扩展针对一小撮有安全/渲染破坏风险的标签,把它们的起始 < 转义成 &lt;,使其变成字面文本而非可执行标签。名单是固定的 9 个

txt
title  textarea  style  xmp  iframe  noembed  noframes  script  plaintext

要点:

  • 只转义起始尖括号,不删除内容、不改语法;名单之外的 HTML(如 <div><span><details>)仍照常透传。
  • 只是一层防护。GitHub.com 与 GitHub Enterprise 在 GFM 转成 HTML 之后,还会做**额外的后处理与内容清洗(sanitization)**来保证安全与一致。tagfilter ≠ 全部防护。
  • 自建 Markdown 渲染管线时,别只依赖 tagfilter,应额外接入 DOMPurify、sanitize-html 等清洗库。

GFM 扩展掌握后,进入 方言差异与 front matter:主流方言地图、YAML front matter、以及那些「看着像 Markdown 其实不通用」的扩展语法与常见坑。