yaml_parse

(PECL yaml >= 0.4.0)

yaml_parse解析 YAML 流

描述

yaml_parse(
    string $input,
    int $pos = 0,
    int &$ndocs = ?,
    array $callbacks = null
): mixed

将 YAML 文档流全部或部分转换为 PHP 变量。

参数

input

要作为 YAML 文档流解析的 string

pos

要从流中提取的文档(-1 表示所有文档,0 表示第一个文档,...)。

ndocs

如果提供 ndocs,则它将填充流中找到的文档数量。

callbacks

YAML 节点的内容处理程序。YAML 标签 => callable 映射的关联 array。有关更多详细信息,请参阅 解析回调

返回值

返回 input 中编码的值,以适当的 PHP 类型表示,或者在失败时返回 false。如果 pos-1,则将返回一个 array,其中包含流中每个文档的条目。

示例

示例 #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 设置禁用此行为。

参见

添加注释

用户贡献的注释 3 注释

Zalmoksis
5 年前
这里似乎是 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 在某些情况下会令人困惑地解释为布尔值。
alpacagm at gmail dot com
12 年前
解释自定义标签的简单使用示例
<?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 中存在相关错误(请参阅跟踪器)
laura dot dean at mooneleaf dot com
7 年前
在通过表单输入字符串时,我必须先对输入使用 utf8_decode,然后才能使用 yaml_parse,否则我会收到一条神秘的错误消息——

警告:yaml_parse():解析时遇到读取错误:不允许使用控制字符(第 1 行,第 1 列)

——即使特殊字符深埋在文件中。
To Top