链接
链接包含链接文本(可见文本),目标链接(作为目标链接的 URI),以及可选的链接标题。Markdown 中有两种基本类型的链接。 在内联链接中,目标和标题在链接文本后立即给出。在引用链接中,目标和标题在文档的其他地方定义。
链接文本是一个由方括号([
和]
)括起的零个或多个内联元素序列组成的。它适用于以下规则:
- 在任意的层嵌套中,链接不能包含其他链接。如果多个其他有效链接定义显示为彼此嵌套,则使用最内层的定义。
- 仅当(a)它们是反斜杠转义或(b)它们显示为匹配的括号对,具有开括号
[
,一系列零或多个内联和一个闭括号]
时,才允许在链接文本中使用括号。 - 行内代码,自动链接和原始HTML 标签比链接文本中的括号绑定地更紧密。 因此,例如,
[foo`]`
不能是链接文本,因为第二个]
是行内代码的一部分。 - 链接文本中的括号比强调标记更紧密,因此,例如,
*[foo*](url)
是一个链接。
目标链接由以下两者组成
- 打开的
<
和闭合的>
之间的零个或多个字符序列,不包含空格,换行符或未转义的<
或>
字符,或者 - 不包含 ASCII 空格或管理的(control)字符的非空字符序列,仅当(a)它们是反斜杠转义或(b)它们是左右括号数量相等的非转义括号对的一部分时。(具体实现中可能会对括号嵌套施加限制以避免性能问题,但至少应支持三层嵌套。)
一个链接标题由以下部分构成
- 直接的双引号字符(
"
)之间的零个或多个字符序列,包括反斜杠转义的"
字符,或者 - 直接的单引号字符(
'
)之间的零个或多个字符序列,包括反斜杠转义的'
字符,或者 - 匹配括号(
(...)
)之间的零个或多个字符序列,仅当反斜杠转义时才包含(
或)
字符。
虽然链接标题可能跨越多行,但它们不能包含空行。
内联链接包含一个链接文本,后面紧跟左括号(
,可选的空格,可选的目标链接,可选的链接标题,通过空格与链接目标分隔,可选的空格和右括号)
。链接的文本由链接文本中包含的内联元素组成(不包括方括号)。链接的 URI 由链接目标组成,不包括封闭的<...>
(如果存在),反斜杠转义符有效,如上所述。
下面是一个简单的内联链接:
示例 493
Markdown | HTML | 效果 |
---|---|---|
|
|
标题可以被省略:
示例 494
Markdown | HTML | 效果 |
---|---|---|
|
|
目标链接地址与标题都可以被省略:
示例 495
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 496
Markdown | HTML | 效果 |
---|---|---|
|
|
如果目标括在尖括号中,则目标只能包含空格:
示例 497
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 498
Markdown | HTML | 效果 |
---|---|---|
|
|
即使用尖括号括起来,目标也不能包含换行符:
示例 499
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 500
Markdown | HTML | 效果 |
---|---|---|
|
|
目标可以包含 )
,如果它包含在尖括号中:
示例 501
Markdown | HTML | 效果 |
---|---|---|
|
|
包含链接的尖括号必须未转义:
示例 502
Markdown | HTML | 效果 |
---|---|---|
|
|
这些不是链接,因为起始的尖括号不匹配:
示例 503
Markdown | HTML | 效果 |
---|---|---|
|
|
目标链接中的括号可能会被转义:
示例 504
Markdown | HTML | 效果 |
---|---|---|
|
|
只要左后括号数量相等的,允许任意数量的括号不被转义:
示例 505
Markdown | HTML | 效果 |
---|---|---|
|
|
如果左右括号数量不相等,你需要转义或者使用尖括号:
示例 506
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 507
Markdown | HTML | 效果 |
---|---|---|
|
|
与 Markdown 一样,括号和其他符号也可以转义:
示例 508
Markdown | HTML | 效果 |
---|---|---|
|
|
链接可以包含片段标识符和查询参数:
示例 509
Markdown | HTML | 效果 |
---|---|---|
|
|
请注意,在不可转义字符之前的反斜杠不发挥转义作用:
示例 510
Markdown | HTML | 效果 |
---|---|---|
|
|
URL 转义应该留在目标链接中,因为所有 URL 转义字符也是有效的 URL 字符。目标中的实体和数字字符引用将被解析为相应的 Unicode 代码点。 当以 HTML 格式编写时,这些可以选择性地进行 URL 转义,但是此规范不强制以 HTML 或其他格式渲染 URL。 渲染器可能会对如何在输出中转义或规范化 URL 做出不同的决定。
示例 511
Markdown | HTML | 效果 |
---|---|---|
|
|
注意,因为标题通常可以解析为目标链接,如果尝试省略目标链接并保留标题,将获得意外的结果:
示例 512
Markdown | HTML | 效果 |
---|---|---|
|
|
标题可以是单引号,双引号或括号:
示例 513
Markdown | HTML | 效果 |
---|---|---|
|
|
可以在标题中使用反斜杠转义和实体和数字字符引用:
示例 514
Markdown | HTML | 效果 |
---|---|---|
|
|
必须使用空格将标题与链接分开。 其他 Unicode 空格如换行空格不起作用。
示例 515
Markdown | HTML | 效果 |
---|---|---|
|
|
如果没有转义字符,则不允许使用嵌套左右数量相等的引号:
示例 516
Markdown | HTML | 效果 |
---|---|---|
|
|
可以通过不同类型的引号来解决这个问题:
示例 517
Markdown | HTML | 效果 |
---|---|---|
|
|
(注:Markdown.pl
确实允许在双引号中使用双引号,其测试套件包括一个证明这一点的测试。但很难看出这带来的额外复杂性的合理理由,因为已经有很多方法——反斜杠转义,实体和数字字符引用,或为封闭的标题——写出包含双引号的标题使用不同类型的引号。Markdown.pl
对于标题的处理还有许多其他奇怪的功能。例如,它允许在内联链接中使用单引号标题,但不是引用链接。并且,在引用链接中而非内联链接,它允许标题以"
开始并以)
结束。Markdown.pl
1.0.1 甚至允许标题没有右引号,但 1.0.2b8 没有。似乎最好采用一个简单,合理的规则,使其在内联链接和链接引用定义中的工作方式相同。)
目标链接和标题周围允许有空格:
示例 518
Markdown | HTML | 效果 |
---|---|---|
|
|
但是链接文本和紧跟的括号之间不允许:
示例 519
Markdown | HTML | 效果 |
---|---|---|
|
|
链接文本可能包含相等数量的左右括号,但不能包含不平衡的括号,除非它们被转义:
示例 520
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 521
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 522
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 523
Markdown | HTML | 效果 |
---|---|---|
|
|
链接文本可能包含内联内容:
示例 524
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 525
Markdown | HTML | 效果 |
---|---|---|
|
|
但是,链接在任何嵌套中都不能包含其他链接。
示例 526
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 527
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 528
Markdown | HTML | 效果 |
---|---|---|
|
|
这些示例说明了链接文本分组优先于强调分组:
示例 529
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 530
Markdown | HTML | 效果 |
---|---|---|
|
|
注意不属于链接的括号_没有_优先级:
示例 531
Markdown | HTML | 效果 |
---|---|---|
|
|
这些案例说明了 HTML 标签,行内代码和自动链接优先于链接分组:
示例 532
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 533
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 534
Markdown | HTML | 效果 |
---|---|---|
|
|
有三种引用链接:完整的,紧凑的和快捷的。
完整引用链接包含一个链接文本,后面紧跟一个链接标签,该链接标签与文档中其他位置的链接引用定义相匹配。
链接标签以左括号([
)开头,以第一个不反斜杠转义的右括号(]
结尾。在这些括号之间必须至少有一个非空字符。链接标签的开始和结束方括号内不允许使用未转义的方括号字符。链接标签在方括号内最多可包含 999 个字符。
一个标签与另一个标签相匹配,以防它们的标准化形式相等。要标准化标签,要移除打开的和闭合的括号,执行 Unicode 大小写折叠,剥离前导和尾随空格,并将连续的内部空格折叠到单个空格。如果存在多个匹配的引用链接定义,则使用文档中第一个引用的引用链接定义。(在这种情况下,最好发出警告。)
第一个链接标签的内容被解析为内联元素,来作为链接的文本。链接的 URI 和标题由匹配的链接引用定义提供。
这里有一个简单的例子:
示例 535
Markdown | HTML | 效果 |
---|---|---|
|
|
链接文本的规则与内联链接的规则相同。从而:
链接文本可能包含相等数量的左右括号,但不包含不平衡括号,除非它们被转义:
示例 536
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 537
Markdown | HTML | 效果 |
---|---|---|
|
|
链接文本可能包含内联内容:
示例 538
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 539
Markdown | HTML | 效果 |
---|---|---|
|
|
但是,任意层嵌套的链接不能包含其他链接。
示例 540
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 541
Markdown | HTML | 效果 |
---|---|---|
|
|
(在上面的示例中,我们有两个快捷引用链接,而不是一个完整的引用链接。)
以下案例说明了链接文本分组优先于强调分组:
示例 542
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 543
Markdown | HTML | 效果 |
---|---|---|
|
|
这些案例说明了 HTML 标签,行内代码和自动链接优先于链接分组:
示例 544
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 545
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 546
Markdown | HTML | 效果 |
---|---|---|
|
|
匹配不区分大小写:
示例 547
Markdown | HTML | 效果 |
---|---|---|
|
|
使用 Unicode 方式折叠:
示例 548
Markdown | HTML | 效果 |
---|---|---|
|
|
为确定匹配,连续的内部空格被视为一个空格:
示例 549
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 550
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 551
Markdown | HTML | 效果 |
---|---|---|
|
|
这与 John Gruber 的原始 Markdown 语法描述不同,后者明确允许链接文本和链接标签之间的空白。它带来了与内联链接一致的引用链接,它们(根据原始 Markdown 和本规范)在链接文本之后不能有空格。更重要的是,它可以防止无意中捕获连续的快捷引用链接。 如果链接文本和链接标签之间允许有空格,那么在下面我们将有一个引用链接,而不是两个快捷引用链接,如下所示:
[foo]
[bar]
[foo]: /url1
[bar]: /url2
(请注意,快捷引用链接是由 Gruber 自己在Markdown.pl
的测试版中引入的,但从未包含在官方语法描述中。如果没有快捷引用链接,在链接文本和链接标签之间允许空格无关紧要;但引入了快捷引用链接,允许这样做太危险了,因为它经常导致意想不到的结果。)
当存在多个匹配的链接参考定义时,使用第一个链接:
示例 552
Markdown | HTML | 效果 |
---|---|---|
|
|
请注意,匹配是在标准化字符串上执行的,而不是解析内联内容。因此,即使标签定义了等效的内联内容,以下内容也不匹配:
示例 553
Markdown | HTML | 效果 |
---|---|---|
|
|
链接标签不能包含括号,除非它们被反斜杠转义:
示例 554
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 555
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 556
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 557
Markdown | HTML | 效果 |
---|---|---|
|
|
请注意,在此示例中]
不是反斜杠转义:
示例 558
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 559
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 560
Markdown | HTML | 效果 |
---|---|---|
|
|
紧凑引用链接由链接标签组成,该链接标签与文档中其他位置的链接参考定义 匹配,后跟字符串[]
。 第一个链接标签的内容被解析为内联,用作链接的文本。 链接的 URI 和标题由匹配的引用链接定义提供。 因此,[foo][]
相当于[foo][foo]
。
示例 561
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 562
Markdown | HTML | 效果 |
---|---|---|
|
|
链接标签不区分大小写:
示例 563
Markdown | HTML | 效果 |
---|---|---|
|
|
与完整引用链接一样,两组括号之间不允许有空格:
示例 564
Markdown | HTML | 效果 |
---|---|---|
|
|
快捷引用链接由链接标签组成,并且与文档中其他位置的链接参考定义 匹配,后面没有 []
或链接标签。 第一个链接标签的内容被解析为内联,用作链接的文本。 链接的 URI 和标题由匹配的链接引用定义提供。因此, [foo]
相当于[foo][]
。
示例 565
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 566
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 567
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 568
Markdown | HTML | 效果 |
---|---|---|
|
|
链接标签不区分大小写:
示例 569
Markdown | HTML | 效果 |
---|---|---|
|
|
应保留链接文本后的空格:
示例 570
Markdown | HTML | 效果 |
---|---|---|
|
|
如果你只想要括号内的文本,可以反斜杠转义开始括号以避免链接:
示例 571
Markdown | HTML | 效果 |
---|---|---|
|
|
请注意,这是一个链接,因为链接标签以第一个后面的右括号结束:
示例 572
Markdown | HTML | 效果 |
---|---|---|
|
|
完整和紧凑引用优先于快捷引用:
示例 573
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 574
Markdown | HTML | 效果 |
---|---|---|
|
|
内联链接也优先:
示例 575
Markdown | HTML | 效果 |
---|---|---|
|
|
示例 576
Markdown | HTML | 效果 |
---|---|---|
|
|
在下面的例子中,[bar][baz]
被解析为引用链接,[foo]
作为普通文本:
示例 577
Markdown | HTML | 效果 |
---|---|---|
|
|
但是在这里,[foo][bar]
被解析为引用链接,因为[bar]
被定义了:
示例 578
Markdown | HTML | 效果 |
---|---|---|
|
|
这里[foo]
没有被解析为快捷引用,因为它后跟一个链接标签(即使没有定义[bar]
):
示例 579
Markdown | HTML | 效果 |
---|---|---|
|
|