链接

链接包含链接文本(可见文本),目标链接(作为目标链接的 URI),以及可选的链接标题。Markdown 中有两种基本类型的链接。 在内联链接中,目标和标题在链接文本后立即给出。在引用链接中,目标和标题在文档的其他地方定义。
链接文本是一个由方括号([])括起的零个或多个内联元素序列组成的。它适用于以下规则:

  • 在任意的层嵌套中,链接不能包含其他链接。如果多个其他有效链接定义显示为彼此嵌套,则使用最内层的定义。
  • 仅当(a)它们是反斜杠转义或(b)它们显示为匹配的括号对,具有开括号[,一系列零或多个内联和一个闭括号 ]时,才允许在链接文本中使用括号。
  • 行内代码自动链接和原始HTML 标签比链接文本中的括号绑定地更紧密。 因此,例如,[foo`]`不能是链接文本,因为第二个]是行内代码的一部分。
  • 链接文本中的括号比强调标记更紧密,因此,例如,*[foo*](url)是一个链接。

目标链接由以下两者组成

  • 打开的<和闭合的>之间的零个或多个字符序列,不包含空格,换行符或未转义的<>字符,或者
  • 不包含 ASCII 空格或管理的(control)字符的非空字符序列,仅当(a)它们是反斜杠转义或(b)它们是左右括号数量相等的非转义括号对的一部分时。(具体实现中可能会对括号嵌套施加限制以避免性能问题,但至少应支持三层嵌套。)

一个链接标题由以下部分构成

  • 直接的双引号字符(")之间的零个或多个字符序列,包括反斜杠转义的"字符,或者
  • 直接的单引号字符(')之间的零个或多个字符序列,包括反斜杠转义的'字符,或者
  • 匹配括号((...))之间的零个或多个字符序列,仅当反斜杠转义时才包含 () 字符。

虽然链接标题可能跨越多行,但它们不能包含空行
内联链接包含一个链接文本,后面紧跟左括号(,可选的空格,可选的目标链接,可选的链接标题,通过空格与链接目标分隔,可选的空格和右括号)。链接的文本由链接文本中包含的内联元素组成(不包括方括号)。链接的 URI 由链接目标组成,不包括封闭的<...>(如果存在),反斜杠转义符有效,如上所述。
下面是一个简单的内联链接:

示例 493

Markdown HTML 效果
[link](/uri "title")

<p><a href="/uri" title="title">link</a></p>

标题可以被省略:

示例 494

Markdown HTML 效果
[link](/uri)

<p><a href="/uri">link</a></p>

目标链接地址与标题都可以被省略:

示例 495

Markdown HTML 效果
[link]()

<p><a href="">link</a></p>

示例 496

Markdown HTML 效果
[link](<>)

<p><a href="">link</a></p>

如果目标括在尖括号中,则目标只能包含空格:

示例 497

Markdown HTML 效果
[link](/my uri)

<p>[link](/my uri)</p>

示例 498

Markdown HTML 效果
[link](</my uri>)

<p><a href="/my%20uri">link</a></p>

即使用尖括号括起来,目标也不能包含换行符:

示例 499

Markdown HTML 效果
[link](foo
bar)

<p>[link](foo
bar)</p>

示例 500

Markdown HTML 效果
[link](<foo
bar>)

<p>[link](<foo
bar>)</p>

目标可以包含 ),如果它包含在尖括号中:

示例 501

Markdown HTML 效果
[a](<b)c>)

<p><a href="b)c">a</a></p>

包含链接的尖括号必须未转义:

示例 502

Markdown HTML 效果
[link](<foo\>)

<p>[link](&lt;foo&gt;)</p>

这些不是链接,因为起始的尖括号不匹配:

示例 503

Markdown HTML 效果
[a](<b)c
[a](<b)c>
[a](<b>c)

<p>[a](&lt;b)c
[a](&lt;b)c&gt;
[a](<b>c)</p>

目标链接中的括号可能会被转义:

示例 504

Markdown HTML 效果
[link](\(foo\))

<p><a href="(foo)">link</a></p>

只要左后括号数量相等的,允许任意数量的括号不被转义:

示例 505

Markdown HTML 效果
[link](foo(and(bar)))

<p><a href="foo(and(bar))">link</a></p>

如果左右括号数量不相等,你需要转义或者使用尖括号:

示例 506

Markdown HTML 效果
[link](foo\(and\(bar\))

<p><a href="foo(and(bar)">link</a></p>

示例 507

Markdown HTML 效果
[link](<foo(and(bar)>)

<p><a href="foo(and(bar)">link</a></p>

与 Markdown 一样,括号和其他符号也可以转义:

示例 508

Markdown HTML 效果
[link](foo\)\:)

<p><a href="foo):">link</a></p>

链接可以包含片段标识符和查询参数:

示例 509

Markdown HTML 效果
[link](#fragment)

[link](http://example.com#fragment)

[link](http://example.com?foo=3#frag)

<p><a href="#fragment">link</a></p>
<p><a href="http://example.com#fragment">link</a></p>
<p><a href="http://example.com?foo=3#frag">link</a></p>

请注意,在不可转义字符之前的反斜杠不发挥转义作用:

示例 510

Markdown HTML 效果
[link](foo\bar)

<p><a href="foo%5Cbar">link</a></p>

URL 转义应该留在目标链接中,因为所有 URL 转义字符也是有效的 URL 字符。目标中的实体和数字字符引用将被解析为相应的 Unicode 代码点。 当以 HTML 格式编写时,这些可以选择性地进行 URL 转义,但是此规范不强制以 HTML 或其他格式渲染 URL。 渲染器可能会对如何在输出中转义或规范化 URL 做出不同的决定。

示例 511

Markdown HTML 效果
[link](foo%20b&auml;)

<p><a href="foo%20b%C3%A4">link</a></p>

注意,因为标题通常可以解析为目标链接,如果尝试省略目标链接并保留标题,将获得意外的结果:

示例 512

Markdown HTML 效果
[link]("title")

<p><a href="%22title%22">link</a></p>

标题可以是单引号,双引号或括号:

示例 513

Markdown HTML 效果
[link](/url "title")
[link](/url 'title')
[link](/url (title))

<p><a href="/url" title="title">link</a>
<a href="/url" title="title">link</a>
<a href="/url" title="title">link</a></p>

可以在标题中使用反斜杠转义和实体和数字字符引用:

示例 514

Markdown HTML 效果
[link](/url "title \"&quot;")

<p><a href="/url" title="title &quot;&quot;">link</a></p>

必须使用空格将标题与链接分开。 其他 Unicode 空格如换行空格不起作用。

示例 515

Markdown HTML 效果
[link](/url "title")

<p><a href="/url%C2%A0%22title%22">link</a></p>

如果没有转义字符,则不允许使用嵌套左右数量相等的引号:

示例 516

Markdown HTML 效果
[link](/url "title "and" title")

<p>[link](/url &quot;title &quot;and&quot; title&quot;)</p>

可以通过不同类型的引号来解决这个问题:

示例 517

Markdown HTML 效果
[link](/url 'title "and" title')

<p><a href="/url" title="title &quot;and&quot; title">link</a></p>

(注:Markdown.pl确实允许在双引号中使用双引号,其测试套件包括一个证明这一点的测试。但很难看出这带来的额外复杂性的合理理由,因为已经有很多方法——反斜杠转义,实体和数字字符引用,或为封闭的标题——写出包含双引号的标题使用不同类型的引号。Markdown.pl对于标题的处理还有许多其他奇怪的功能。例如,它允许在内联链接中使用单引号标题,但不是引用链接。并且,在引用链接中而非内联链接,它允许标题以"开始并以)结束。Markdown.pl 1.0.1 甚至允许标题没有右引号,但 1.0.2b8 没有。似乎最好采用一个简单,合理的规则,使其在内联链接和链接引用定义中的工作方式相同。)
目标链接和标题周围允许有空格

示例 518

Markdown HTML 效果
[link](   /uri
  "title"  )

<p><a href="/uri" title="title">link</a></p>

但是链接文本和紧跟的括号之间不允许:

示例 519

Markdown HTML 效果
[link] (/uri)

<p>[link] (/uri)</p>

链接文本可能包含相等数量的左右括号,但不能包含不平衡的括号,除非它们被转义:

示例 520

Markdown HTML 效果
[link [foo [bar]]](/uri)

<p><a href="/uri">link [foo [bar]]</a></p>

示例 521

Markdown HTML 效果
[link] bar](/uri)

<p>[link] bar](/uri)</p>

示例 522

Markdown HTML 效果
[link [bar](/uri)

<p>[link <a href="/uri">bar</a></p>

示例 523

Markdown HTML 效果
[link \[bar](/uri)

<p><a href="/uri">link [bar</a></p>

链接文本可能包含内联内容:

示例 524

Markdown HTML 效果
[link *foo **bar** `#`*](/uri)

<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>

示例 525

Markdown HTML 效果
[![moon](moon.jpg)](/uri)

<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>

但是,链接在任何嵌套中都不能包含其他链接。

示例 526

Markdown HTML 效果
[foo [bar](/uri)](/uri)

<p>[foo <a href="/uri">bar</a>](/uri)</p>

示例 527

Markdown HTML 效果
[foo *[bar [baz](/uri)](/uri)*](/uri)

<p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>

示例 528

Markdown HTML 效果
![[[foo](uri1)](uri2)](uri3)

<p><img src="uri3" alt="[foo](uri2)" /></p>

这些示例说明了链接文本分组优先于强调分组:

示例 529

Markdown HTML 效果
*[foo*](/uri)

<p>*<a href="/uri">foo*</a></p>

示例 530

Markdown HTML 效果
[foo *bar](baz*)

<p><a href="baz*">foo *bar</a></p>

注意不属于链接的括号_没有_优先级:

示例 531

Markdown HTML 效果
*foo [bar* baz]

<p><em>foo [bar</em> baz]</p>

这些案例说明了 HTML 标签,行内代码和自动链接优先于链接分组:

示例 532

Markdown HTML 效果
[foo <bar attr="](baz)">

<p>[foo <bar attr="](baz)"></p>

示例 533

Markdown HTML 效果
[foo`](/uri)`

<p>[foo<code>](/uri)</code></p>

示例 534

Markdown HTML 效果
[foo<http://example.com/?search=](uri)>

<p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p>

有三种引用链接完整的紧凑的快捷的
完整引用链接包含一个链接文本,后面紧跟一个链接标签,该链接标签与文档中其他位置的链接引用定义匹配
链接标签以左括号([)开头,以第一个不反斜杠转义的右括号(]结尾。在这些括号之间必须至少有一个非空字符。链接标签的开始和结束方括号内不允许使用未转义的方括号字符。链接标签在方括号内最多可包含 999 个字符。
一个标签与另一个标签相匹配,以防它们的标准化形式相等。要标准化标签,要移除打开的和闭合的括号,执行 Unicode 大小写折叠,剥离前导和尾随空格,并将连续的内部空格折叠到单个空格。如果存在多个匹配的引用链接定义,则使用文档中第一个引用的引用链接定义。(在这种情况下,最好发出警告。)
第一个链接标签的内容被解析为内联元素,来作为链接的文本。链接的 URI 和标题由匹配的链接引用定义提供。
这里有一个简单的例子:

示例 535

Markdown HTML 效果
[foo][bar]

[bar]: /url "title"

<p><a href="/url" title="title">foo</a></p>

链接文本的规则与内联链接的规则相同。从而:
链接文本可能包含相等数量的左右括号,但不包含不平衡括号,除非它们被转义:

示例 536

Markdown HTML 效果
[link [foo [bar]]][ref]

[ref]: /uri

<p><a href="/uri">link [foo [bar]]</a></p>

示例 537

Markdown HTML 效果
[link \[bar][ref]

[ref]: /uri

<p><a href="/uri">link [bar</a></p>

链接文本可能包含内联内容:

示例 538

Markdown HTML 效果
[link *foo **bar** `#`*][ref]

[ref]: /uri

<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>

示例 539

Markdown HTML 效果
[![moon](moon.jpg)][ref]

[ref]: /uri

<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>

但是,任意层嵌套的链接不能包含其他链接。

示例 540

Markdown HTML 效果
[foo [bar](/uri)][ref]

[ref]: /uri

<p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p>

示例 541

Markdown HTML 效果
[foo *bar [baz][ref]*][ref]

[ref]: /uri

<p>[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p>

(在上面的示例中,我们有两个快捷引用链接,而不是一个完整的引用链接。)
以下案例说明了链接文本分组优先于强调分组:

示例 542

Markdown HTML 效果
*[foo*][ref]

[ref]: /uri

<p>*<a href="/uri">foo*</a></p>

示例 543

Markdown HTML 效果
[foo *bar][ref]*

[ref]: /uri

<p><a href="/uri">foo *bar</a>*</p>

这些案例说明了 HTML 标签,行内代码和自动链接优先于链接分组:

示例 544

Markdown HTML 效果
[foo <bar attr="][ref]">

[ref]: /uri

<p>[foo <bar attr="][ref]"></p>

示例 545

Markdown HTML 效果
[foo`][ref]`

[ref]: /uri

<p>[foo<code>][ref]</code></p>

示例 546

Markdown HTML 效果
[foo<http://example.com/?search=][ref]>

[ref]: /uri

<p>[foo<a href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]</a></p>

匹配不区分大小写:

示例 547

Markdown HTML 效果
[foo][BaR]

[bar]: /url "title"

<p><a href="/url" title="title">foo</a></p>

使用 Unicode 方式折叠:

示例 548

Markdown HTML 效果
[ẞ]

[SS]: /url

<p><a href="/url"></a></p>

为确定匹配,连续的内部空格被视为一个空格:

示例 549

Markdown HTML 效果
[Foo
  bar]: /url

[Baz][Foo bar]

<p><a href="/url">Baz</a></p>

链接文本链接标签之间不允许有空格

示例 550

Markdown HTML 效果
[foo] [bar]

[bar]: /url "title"

<p>[foo] <a href="/url" title="title">bar</a></p>

示例 551

Markdown HTML 效果
[foo]
[bar]

[bar]: /url "title"

<p>[foo]
<a href="/url" title="title">bar</a></p>

这与 John Gruber 的原始 Markdown 语法描述不同,后者明确允许链接文本和链接标签之间的空白。它带来了与内联链接一致的引用链接,它们(根据原始 Markdown 和本规范)在链接文本之后不能有空格。更重要的是,它可以防止无意中捕获连续的快捷引用链接。 如果链接文本和链接标签之间允许有空格,那么在下面我们将有一个引用链接,而不是两个快捷引用链接,如下所示:

[foo]
[bar]

[foo]: /url1
[bar]: /url2

(请注意,快捷引用链接是由 Gruber 自己在Markdown.pl的测试版中引入的,但从未包含在官方语法描述中。如果没有快捷引用链接,在链接文本和链接标签之间允许空格无关紧要;但引入了快捷引用链接,允许这样做太危险了,因为它经常导致意想不到的结果。)
当存在多个匹配的链接参考定义时,使用第一个链接:

示例 552

Markdown HTML 效果
[foo]: /url1

[foo]: /url2

[bar][foo]

<p><a href="/url1">bar</a></p>

请注意,匹配是在标准化字符串上执行的,而不是解析内联内容。因此,即使标签定义了等效的内联内容,以下内容也不匹配:

示例 553

Markdown HTML 效果
[bar][foo\!]

[foo!]: /url

<p>[bar][foo!]</p>

链接标签不能包含括号,除非它们被反斜杠转义:

示例 554

Markdown HTML 效果
[foo][ref[]

[ref[]: /uri

<p>[foo][ref[]</p>
<p>[ref[]: /uri</p>

示例 555

Markdown HTML 效果
[foo][ref[bar]]

[ref[bar]]: /uri

<p>[foo][ref[bar]]</p>
<p>[ref[bar]]: /uri</p>

示例 556

Markdown HTML 效果
[[[foo]]]

[[[foo]]]: /url

<p>[[[foo]]]</p>
<p>[[[foo]]]: /url</p>

示例 557

Markdown HTML 效果
[foo][ref\[]

[ref\[]: /uri

<p><a href="/uri">foo</a></p>

请注意,在此示例中]不是反斜杠转义:

示例 558

Markdown HTML 效果
[bar\\]: /uri

[bar\\]

<p><a href="/uri">bar\</a></p>

链接标签必须至少包含一个非空字符

示例 559

Markdown HTML 效果
[]

[]: /uri

<p>[]</p>
<p>[]: /uri</p>

示例 560

Markdown HTML 效果
[
 ]

[
 ]: /uri

<p>[
]</p>
<p>[
]: /uri</p>

紧凑引用链接链接标签组成,该链接标签与文档中其他位置的链接参考定义 匹配,后跟字符串[]。 第一个链接标签的内容被解析为内联,用作链接的文本。 链接的 URI 和标题由匹配的引用链接定义提供。 因此,[foo][]相当于[foo][foo]

示例 561

Markdown HTML 效果
[foo][]

[foo]: /url "title"

<p><a href="/url" title="title">foo</a></p>

示例 562

Markdown HTML 效果
[*foo* bar][]

[*foo* bar]: /url "title"

<p><a href="/url" title="title"><em>foo</em> bar</a></p>

链接标签不区分大小写:

示例 563

Markdown HTML 效果
[Foo][]

[foo]: /url "title"

<p><a href="/url" title="title">Foo</a></p>

与完整引用链接一样,两组括号之间不允许有空格

示例 564

Markdown HTML 效果
[foo] 
[]

[foo]: /url "title"

<p><a href="/url" title="title">foo</a>
[]</p>

快捷引用链接链接标签组成,并且与文档中其他位置的链接参考定义 匹配,后面没有 [] 或链接标签。 第一个链接标签的内容被解析为内联,用作链接的文本。 链接的 URI 和标题由匹配的链接引用定义提供。因此, [foo] 相当于[foo][]

示例 565

Markdown HTML 效果
[foo]

[foo]: /url "title"

<p><a href="/url" title="title">foo</a></p>

示例 566

Markdown HTML 效果
[*foo* bar]

[*foo* bar]: /url "title"

<p><a href="/url" title="title"><em>foo</em> bar</a></p>

示例 567

Markdown HTML 效果
[[*foo* bar]]

[*foo* bar]: /url "title"

<p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p>

示例 568

Markdown HTML 效果
[[bar [foo]

[foo]: /url

<p>[[bar <a href="/url">foo</a></p>

链接标签不区分大小写:

示例 569

Markdown HTML 效果
[Foo]

[foo]: /url "title"

<p><a href="/url" title="title">Foo</a></p>

应保留链接文本后的空格:

示例 570

Markdown HTML 效果
[foo] bar

[foo]: /url

<p><a href="/url">foo</a> bar</p>

如果你只想要括号内的文本,可以反斜杠转义开始括号以避免链接:

示例 571

Markdown HTML 效果
\[foo]

[foo]: /url "title"

<p>[foo]</p>

请注意,这是一个链接,因为链接标签以第一个后面的右括号结束:

示例 572

Markdown HTML 效果
[foo*]: /url

*[foo*]

<p>*<a href="/url">foo*</a></p>

完整和紧凑引用优先于快捷引用:

示例 573

Markdown HTML 效果
[foo][bar]

[foo]: /url1
[bar]: /url2

<p><a href="/url2">foo</a></p>

示例 574

Markdown HTML 效果
[foo][]

[foo]: /url1

<p><a href="/url1">foo</a></p>

内联链接也优先:

示例 575

Markdown HTML 效果
[foo]()

[foo]: /url1

<p><a href="">foo</a></p>

示例 576

Markdown HTML 效果
[foo](not a link)

[foo]: /url1

<p><a href="/url1">foo</a>(not a link)</p>

在下面的例子中,[bar][baz]被解析为引用链接,[foo]作为普通文本:

示例 577

Markdown HTML 效果
[foo][bar][baz]

[baz]: /url

<p>[foo]<a href="/url">bar</a></p>

但是在这里,[foo][bar]被解析为引用链接,因为[bar]被定义了:

示例 578

Markdown HTML 效果
[foo][bar][baz]

[baz]: /url1
[bar]: /url2

<p><a href="/url2">foo</a><a href="/url1">baz</a></p>

这里[foo]没有被解析为快捷引用,因为它后跟一个链接标签(即使没有定义[bar]):

示例 579

Markdown HTML 效果
[foo][bar][baz]

[baz]: /url1
[foo]: /url2

<p>[foo]<a href="/url1">bar</a></p>