简述YAML语言

YAML

YAML是一个可读性高,用来表达资料序列的编程语言。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。目前已经有数种编程语言或脚本语言支援这种语言。 YAML是”YAML Ain’t a Markup Language”的递回缩写。
YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。
YAML实质上是一种通用的数据串行化格式

基本语法规则

大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
YAML 中添加注释的方式是通过井字符(#)

支持的数据结构

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值

适用场景

脚本语言
由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。如:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript,除了Java,其他都是脚本语言。
序列化
YAML比较适合做序列化。因为它是宿主语言数据类型直转的。
配置文件
YAML做配置文件也不错。写YAML要比写XML快得多(无需关注标签或引号),并且比ini文档功能更强。
比如Ruby on Rails的配置就选用的YAML。对ROR而言,这很自然,也很省事.
由于兼容性问题,不同语言间的数据流转建议不要用YAML

安全性

YAML是纯粹用来表达资料的语言,所以内部不会存代码注入的可执行命令。这代表剖析器会相当(至少)安全的解析文件,而不用担心潜在与执行命令相关的安全漏洞。举例来说,JSON是JavaScript的子集,使用JavaScript本身的剖析器是相当诱人的,不过也造成许多代码注入的漏洞。虽然在所有资料序列语言中,安全解析本质上是可能的,但可执行性却正是这样一个恶名昭彰的缺陷;而YAML缺乏相关的命令语言,可能相对安全。

语法简述

#开始行
---

#对象
string: hello
code: 110

#复合结构
address:
- province: beijing
- city: beijing
- district: changping

#数组及多维数组,以-加空格开始,注意空格缩进,不支持tab
ages:
- age_10:
- 101
- 102
- 103
- age_20
- age_30
- age_40
#或者
ages_bak: [age_10,age_20,age_30]

#不可分割的数据类型
#字符串,布尔值,整数,浮点数,NULL,时间,日期
number: 12.30
integer: 1000
isSet: true
parent: ~
iso8601: 2001-12-14t21:59:43.10-05:00
date: 2017-09-28

#YAML 允许使用两个感叹号,强制转换数据类型
int_to_str: !!str 123
str_to_bool: !!str true

#引用
#锚点&和别名*,可以用来引用
quote: &quote
    host: 127.0.0.1
    port: 6379

config:
database: mysql
<<: *quote

两个重要函数

使用yaml_emit可以将其转化成YAML
yaml=yamlemit( invoice);
使用yaml_parse解析YAML:

DEMO测试

将上面的代码存储为test.yaml

<?php
$file = glob('/mnt/yaml/*.{yaml,yml}', GLOB_BRACE);
$data = parse($file[0]);
var_dump($data);
function parse($file)
{
if (file_exists($file)) {
return yaml_parse_file($file);
}
return false;
}

结果如下:

array(15) {
["string"]=>
string(5) "hello"
["code"]=>
int(110)
["address"]=>
array(3) {
[0]=>
array(1) {
["province"]=>
string(7) "beijing"
}
[1]=>
array(1) {
["city"]=>
string(7) "beijing"
}
[2]=>
array(1) {
["district"]=>
string(9) "changping"
}
}
["ages"]=>
array(4) {
[0]=>
array(1) {
["age_10"]=>
array(3) {
[0]=>
int(101)
[1]=>
int(102)
[2]=>
int(103)
}
}
[1]=>
string(6) "age_20"
[2]=>
string(6) "age_30"
[3]=>
string(6) "age_40"
}
["ages_bak"]=>
array(3) {
[0]=>
string(6) "age_10"
[1]=>
string(6) "age_20"
[2]=>
string(6) "age_30"
}
["number"]=>
float(12.3)
["integer"]=>
int(1000)
["isSet"]=>
bool(true)
["parent"]=>
NULL
["iso8601"]=>
string(28) "2001-12-14t21:59:43.10-05:00"
["date"]=>
string(10) "2017-09-28"
["int_to_str"]=>
string(3) "123"
["str_to_bool"]=>
string(4) "true"
["quote"]=>
array(2) {
["host"]=>
string(9) "127.0.0.1"
["port"]=>
int(6379)
}
["config"]=>
array(3) {
["database"]=>
string(5) "mysql"
["host"]=>
string(9) "127.0.0.1"
["port"]=>
int(6379)
}
}

唯一感觉遗憾的是不支持tab,用空格来表示层级关系。不管怎样,写配置文件感觉还是不错的。

在线yaml解析工具,验证yaml文件是否正确
http://yaml-online-parser.appspot.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值