# 链接

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

目标链接 (opens new window)由以下两者组成

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

一个链接标题 (opens new window)由以下部分构成

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

虽然链接标题 (opens new window)可能跨越多行,但它们不能包含空行 (opens new window)
内联链接 (opens new window)包含一个链接文本 (opens new window),后面紧跟左括号(,可选的空格 (opens new window),可选的目标链接 (opens new window),可选的链接标题 (opens new window),通过空格 (opens new window)与链接目标分隔,可选的空格 (opens new window)和右括号)。链接的文本由链接文本 (opens new window)中包含的内联元素组成(不包括方括号)。链接的 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>

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

示例 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 没有。似乎最好采用一个简单,合理的规则,使其在内联链接和链接引用定义中的工作方式相同。)
目标链接和标题周围允许有空格 (opens new window)

示例 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>

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

示例 535

Markdown HTML 效果
[foo][bar]

[bar]: /url "title"

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

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

示例 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>

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

示例 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>

为确定匹配,连续的内部空格 (opens new window)被视为一个空格:

示例 549

Markdown HTML 效果
[Foo
  bar]: /url

[Baz][Foo bar]

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

链接文本 (opens new window)链接标签 (opens new window)之间不允许有空格 (opens new window)

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

[foo]
[bar]

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

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

示例 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>

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

示例 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>

链接标签 (opens new window)必须至少包含一个非空字符 (opens new window)

示例 559

Markdown HTML 效果
[]

[]: /uri

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

示例 560

Markdown HTML 效果
[
 ]

[
 ]: /uri

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

紧凑引用链接 (opens new window)链接标签 (opens new window)组成,该链接标签与文档中其他位置的链接参考定义 (opens new window) 匹配 (opens new window),后跟字符串[]。 第一个链接标签的内容被解析为内联,用作链接的文本。 链接的 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>

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

示例 564

Markdown HTML 效果
[foo] 
[]

[foo]: /url "title"

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

快捷引用链接 (opens new window)链接标签 (opens new window)组成,并且与文档中其他位置的链接参考定义 (opens new window) 匹配 (opens new window),后面没有 [] 或链接标签。 第一个链接标签的内容被解析为内联,用作链接的文本。 链接的 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>