2024 日本 PHP 研討會

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
函式 cb_yaml_date($value, $tag, $flags) {
return new
DateTime($value);
}

$yaml = <<<YAML
event1:
name: 我的活動
date: !date 25.05.2001
YAML;

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

print_r($data);
?>

以上範例會輸出類似以下的內容:

陣列
(
[event1] => 陣列
(
[name] => 我的活動
[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