支付宝扫一扫付款
                    微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
根据 YAML 官方网站的说法,YAML是“一个对所有编程语言都十分友好的序列化标准”(a human friendly data serialization standard for all programming languages)。
就算YAML能够描述复杂的嵌套数据结构,本文仍然只解释“在使用YAML进行文件配置时”所需要的最小化功能集合。
YAML是个简单的语言,可以描述数据。就像PHP,它有诸如字符串、布尔值、浮点或整型等简单的类型语法。但是不同于PHP,它在数组(顺序型)和哈希(映射型)上面有所不同。
标量的语法类似于PHP。
YAML字符串可以用单引或双引号来打包。某些情况下,它们也可以不加引号:
1 2 3 4 5  | A string in YAML
 
'A singled-quoted string in YAML'
 
"A double-quoted string in YAML" | 
引号十分有用,当字符串起始或结束于“一或多个空格”的话,因为在进行解析式,未加引号的字符串将被两头清空格(trimmed)。当字符串包括特殊的或保留的字符时,使用引号是必须的。
当使用单引号字符串时,内容中的任何单个 ' 必须使用两次以进行转义:
1  | 'A single quote '' inside a single-quoted string' | 
字符串中包含以下内容时必须使用引号。虽然你可以使用双引,对于这些字符使用单引更为方便,可以避免被迫使用任何 \ 来进行转义:
:, {, }, [, ], ,, &, *, #, ?, |,
-, <, >, =, !, %, @, `双引号提供了一种用于表达任意字符串的方式,使用 \ 来转义字符或排序。例如,当你需要内嵌 \n 或Unicode字符到一个字符串中时,它非常有用:
1  | "A double-quoted string in YAML\n" | 
如果字符串包含下列控制字符(control characters),必须使用双引进行转义:
\0, \x01, \x02, \x03, \x04, \x05, \x06, \a,
\b, \t, \n, \v, \f, \r, \x0e, \x0f, \x10,
\x11, \x12, \x13, \x14, \x15, \x16, \x17, \x18,
\x19, \x1a, \e, \x1c, \x1d, \x1e, \x1f, \N,
\_, \L, \P最后,还有其他一些场合需要引号,不管你使用双引还是单引:
true 或 false (否则,它将被当作布尔值对待);null 或 ~ (否则,它会被认为是 null 值);2, 14, 等等),
floats (e.g. 2.6, 14.9) 以及指数数字 (如 12e7, 等等)
(否则,它将被当作数字值对待);2014-12-31) (否则,它将被自动转换成Unix timestamp)。当一个字符串包含line break(换行)时,你应该使用literal style,它通过pipe(|)进行指示,以指明一个字符串将撑开数行。在literal中,新行是被保留的:
1 2 3  | |
  \/ /| |\/| |
  / / | |  | |__ | 
另可选择的是,字符串能够以folded style进行书写,它通过 > 来进行指示,里面的每一个换行将被一个空格替代:
1 2 3 4 5  | >
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  without carriage returns. | 
要注意上面例子中的每一行前面的两个空格。它们不会在PHP程序中的结果字符串中出现。
1 2  | # an integer / 整形
12 | 
1 2  | # an octal / 八进制
014 | 
1 2  | # an hexadecimal / 十六进制
0xC | 
1 2  | # a float / 浮点
13.4 | 
1 2  | # an exponential number / 指数数字
1.2e+34 | 
1 2  | # infinity / 无限大
.inf | 
YAML中的null可以被表达为 null or ~。
YAML中的布尔值可以被表达为 true and false。
YAML使用ISO-8601标准来表达日期:
1  | 2001-12-14T21:59:43.10-05:00 | 
1 2  | # simple date / 简单日期
2002-12-14 | 
一个YAML文件很少只用来描述简单标量。多数时候,它要描述集合(collection)。一个集合,可以包含顺序型或映射型的元素。两种方式皆可转换为PHP数组。
顺序型使用dash(-),其后跟上一个空格:
1 2 3  | - PHP
- Perl
- Python | 
这个YAML文件等同于下面的PHP代码:
1  | array('PHP', 'Perl', 'Python'); | 
映射型使用冒号加空格(:)以形成键值对:
1 2 3  | PHP: 5.2
MySQL: 5.1
Apache: 2.2.20 | 
等同于以下PHP代码:
1  | array('PHP' => 5.2, 'MySQL' => 5.1, 'Apache' => '2.2.20'); | 
在一个映射中,键可以是任何有效的标量。
冒号和值之间的空格数量无关紧要:
1 2 3  | PHP:    5.2
MySQL:  5.1
Apache: 2.2.20 | 
在描述嵌套集合时,YAML使用一或多个空格的缩进:
1 2 3 4 5 6  | 'symfony 1.0':
  PHP:    5.0
  Propel: 1.2
'symfony 1.2':
  PHP:    5.2
  Propel: 1.3 | 
以上YAML文件等同于以下PHP代码:
在YAML文件中使用缩进时,你必须牢记一件重要的事:缩进必须由一或多个空格来完成,但绝对不要使用制表符(tabulators)。
你可以随心所欲地嵌套顺序型和数组型集合:
1 2 3 4 5 6  | 'Chapter 1':
  - Introduction
  - Event Types
'Chapter 2':
  - Introduction
  - Helpers | 
YAML也可以使用以下风格的集合,使用显式的分隔符而非缩进,来标记其范围。
顺序型集合可以在方括号([])中以逗号来分隔列表:
1  | [PHP, Perl, Python] | 
映射型集合可以在大括号({})中以逗号来分隔键值对:
1  | { PHP: 5.2, MySQL: 5.1, Apache: 2.2.20 } | 
你可以混合使用并实现风格匹配,以增强可读性:
1 2  | 'Chapter 1': [Introduction, Event Types]
'Chapter 2': [Introduction, Helpers] | 
1 2  | 'symfony 1.0': { PHP: 5.0, Propel: 1.2 }
'symfony 1.2': { PHP: 5.2, Propel: 1.3 } | 
可以通过添加井号(#)来完成YAML文件中的注释:
1 2 3 4  | # Comment on a line / 整行注释
"symfony 1.0": { PHP: 5.0, Propel: 1.2 } # Comment at the end of a line
                                         # 单行结尾处的注释
"symfony 1.2": { PHP: 5.2, Propel: 1.3 } | 
注释将被YAML解析器直接忽略,毋须“根据集合中的嵌套层级”而刻意缩进。
本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。