yaml_parse_file

(PECL yaml >= 0.4.0)

yaml_parse_file从文件解析 YAML 流

描述

yaml_parse_file(
    字符串 $filename,
    整数 $pos = 0,
    整数 &$ndocs = ?,
    数组 $callbacks = null
): 混合

将从文件读取的 YAML 文档流的全部或部分转换为 PHP 变量。

参数

filename

文件路径。

pos

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

ndocs

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

callbacks

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

返回值

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

备注

警告

如果对使用 !php/object 标签的节点启用了 unserialize() 的使用,则使用 yaml_parse_file() 处理不可信用户输入是危险的。可以通过使用 yaml.decode_php ini 设置来禁用此行为。

参见

添加备注

用户贡献备注 4 则备注

Dan M
4 年前
请注意,在解析 yaml 时,未引用的 Y 值将变为布尔值 true

这可能是所需或不需要的行为,具体取决于上下文

- chr_name: X // 变为字符串 X
- chr_name: Y // 变为布尔值 true

[
[chr_name => X],
[chr_name => true],
]

您肯定不希望 Y 染色体变为 1 染色体(true),就像发生在我身上一样,所以请注意!
Arne L.
9 年前
正如 Jesse Donat 所提到的,类型将自动推断。要强制执行某些类型,您可以使用回调功能,如下所示

<?php
function cb_yaml_date($value, $tag, $flags) {
return new
DateTime($value);
}

$yaml = <<<YAML
event1:
name: My Event
date: !date 25.05.2001
YAML;

$ndocs = 0;
$data = yaml_parse($yaml, 0, $ndocs, array('!date' => 'cb_yaml_date'));

print_r($data);
?>

上面的示例将输出类似于以下内容

数组
(
[event1] => 数组
(
[name] => My Event
[date] => DateTime 对象
(
[date] => 2001-05-25 00:00:00
[timezone_type] => 3
[timezone] => Europe/Berlin
)

)

)

顺便说一下,如果您想使用大数字,您可能正在使用 BC Math。因此,您只需将数字用引号括起来

<?php
$yaml
= <<<YAML
largenumber: '14695760472279668267313200104308'
YAML;
?>
Jesse Donat
13 年前
这完全取决于类型检测 - 据我所知,没有办法强制类型,例如,当您将一个非常长的整数作为值时 - 在我的情况下是 1313035348823 - 它被限制为 2147483647 - PHP 的最大整数。
DarckCrystale
6 年前
尝试读取空文件时,yaml_parse_file() 会抛出警告

PHP 警告:yaml_parse_file():到达流的末尾,但未找到文档 0
To Top