PHP Conference Japan 2024

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 标签 => 可调用 映射的关联 数组。有关详细信息,请参见 解析回调

返回值

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

注释

警告

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

参见

添加注释

用户贡献的注释 3 个注释

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 的最大整数。
To Top