php[world] 2019 — 25 years of PHP

yaml_parse

(PECL yaml >= 0.4.0)

yaml_parseРазбирает поток YAML

Описание

yaml_parse ( string $input [, int $pos = 0 [, int &$ndocs [, array $callbacks = NULL ]]] ) : mixed

Конвертирует весь поток 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.

Смотрите также

add a note add a note

User Contributed Notes 3 notes

up
4
alpacagm at gmail dot com
7 years ago
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)
up
1
Zalmoksis
5 months ago
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.
up
0
laura dot dean at mooneleaf dot com
2 years ago
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.
To Top