(PECL yaml >= 0.4.0)
yaml_parse — Разбирает поток YAML
Конвертирует весь поток YAML или его часть и записывает в переменную.
inputСтрока для парсинга как поток YAML.
pos
Документ для разбора (-1 для всех документов, 0 для первого документа, ...).
ndocs
Если ndocs найден, тогда он будет заменён на количество
документов в потоке YAML.
callbacksОбработчики содержимого для узлов YAML. Ассоциативный массив (array ), ключи которого являются тегами YAML, а значения callback-функциями (callable ), которые будут их обрабатывать. Более подробно этот механизм описан в разделе callback-функции разбора.
Возвращает значение, закодированное в input, в соответствующем
типе PHP или false , если возникла ошибка. Если параметр pos равен
-1, будет возвращён массив, содержащий по одной записи для каждого
документа, найденного в потоке.
Пример #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
site: zxibit.esy.es
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."
}
Обрабатывать непроверенный пользовательский ввод, в случае когда для узлов YAML,
использующих тег !php/object, разрешено использование функции unserialize() , крайне опасно. Это поведение можно отключить с помощью
ini-настройки yaml.decode_php.
It seams the YAML standard version here is the 1.1 and not the (1.2 released in 2009), so all of the following values: y, Y, yes, Yes, YES, n, N, no, No, NO, true, True, TRUE, false, False, FALSE, on, On, ON, off, Off, OFF are confusingly at times interpreted as booleans.Simple usage example of interpreting custom tags:
<?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']);
?>
output:
Array
(
[data] => baz test
)
note, there is a related bug in version 1.0.1 (see tracker)When entering the string through a form, I had to first use utf8_decode on the input before using yaml_parse or else I got a cryptic error message --
Warning: yaml_parse(): reading error encountered during parsing: control characters are not allowed (line 1, column 1)
-- even though the special character was buried deep in the file.