这里似乎是 YAML 标准版本 1.1,而不是(2009 年发布的 1.2),因此以下所有值:y、Y、yes、Yes、YES、n、N、no、No、NO、true、True、TRUE、false、False、FALSE、on、On、ON、off、Off、OFF 在某些情况下会令人困惑地解释为布尔值。
(PECL yaml >= 0.4.0)
yaml_parse — 解析 YAML 流
将 YAML 文档流全部或部分转换为 PHP 变量。
示例 #1 yaml_parse() 示例
<?php
$yaml = <<<EOD
---
invoice: 34843
date: "2001-01-23"
bill-to: &id001
given: Chris
family: Dumars
address:
lines: |-
458 Walkman Dr.
Suite #292
city: Royal Oak
state: MI
postal: 48046
ship-to: *id001
product:
- sku: BL394D
quantity: 4
description: Basketball
price: 450
- sku: BL4438H
quantity: 1
description: Super Hoop
price: 2392
tax: 251.420000
total: 4443.520000
comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
...
EOD;
$parsed = yaml_parse($yaml);
var_dump($parsed);
?>
上面的示例将输出类似于以下内容
array(8) { ["invoice"]=> int(34843) ["date"]=> string(10) "2001-01-23" ["bill-to"]=> &array(3) { ["given"]=> string(5) "Chris" ["family"]=> string(6) "Dumars" ["address"]=> array(4) { ["lines"]=> string(34) "458 Walkman Dr. Suite #292" ["city"]=> string(9) "Royal Oak" ["state"]=> string(2) "MI" ["postal"]=> int(48046) } } ["ship-to"]=> &array(3) { ["given"]=> string(5) "Chris" ["family"]=> string(6) "Dumars" ["address"]=> array(4) { ["lines"]=> string(34) "458 Walkman Dr. Suite #292" ["city"]=> string(9) "Royal Oak" ["state"]=> string(2) "MI" ["postal"]=> int(48046) } } ["product"]=> array(2) { [0]=> array(4) { ["sku"]=> string(6) "BL394D" ["quantity"]=> int(4) ["description"]=> string(10) "Basketball" ["price"]=> int(450) } [1]=> array(4) { ["sku"]=> string(7) "BL4438H" ["quantity"]=> int(1) ["description"]=> string(10) "Super Hoop" ["price"]=> int(2392) } } ["tax"]=> float(251.42) ["total"]=> float(4443.52) ["comments"]=> string(68) "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338." }
如果为使用 !php/object
标签的节点启用了 unserialize() 的使用,则使用 yaml_parse() 处理不可信用户输入是危险的。可以使用 yaml.decode_php
ini 设置禁用此行为。
这里似乎是 YAML 标准版本 1.1,而不是(2009 年发布的 1.2),因此以下所有值:y、Y、yes、Yes、YES、n、N、no、No、NO、true、True、TRUE、false、False、FALSE、on、On、ON、off、Off、OFF 在某些情况下会令人困惑地解释为布尔值。
解释自定义标签的简单使用示例
<?php
$data=
"#yaml
---
data: !mytag bar test
...
";
function callback($value){
return str_replace('bar','baz',$value);
}
$cnt;
$array=yaml_parse($data,0,$cnt,array('!mytag'=>'callback'));
print_r($array['data']);
?>
输出
数组
(
[data] => baz test
)
注意,版本 1.0.1 中存在相关错误(请参阅跟踪器)
在通过表单输入字符串时,我必须先对输入使用 utf8_decode,然后才能使用 yaml_parse,否则我会收到一条神秘的错误消息——
警告:yaml_parse():解析时遇到读取错误:不允许使用控制字符(第 1 行,第 1 列)
——即使特殊字符深埋在文件中。