# 链接

链接包含链接文本 (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)