如何使用PHP-YAML的自定义标记回调?

时间:2011-06-24 20:47:49

标签: php yaml

根据official documentation,有一种方法可以为自定义YAML标记提供回调:

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

回调
  YAML节点的内容处理程序。 YAML标签的关联数组=>回调映射。

但是,即使在扩展源中,似乎也没有关于该主题的其他文档!

我创建了这个脚本作为测试:

<?php

$yaml =<<<YAML
---
prop: !custom val
YAML;

print_r(yaml_parse($yaml,0,$n,array(
  YAML_STR_TAG => function () {
    echo "YAML_STR_TAG\n";
    $args = func_get_args();
    print_r($args);
    return 'x';
  },
  '!custom' => function () {
    echo "!custom\n";
    $args = func_get_args();
    print_r($args);
    return 'y';
  }
)));

我得到了这个输出:

$ php yaml.php
YAML_STR_TAG
Array
(
    [0] => prop
    [1] => tag:yaml.org,2002:str
    [2] => 1
)
!custom
Array
(
    [0] => val
    [1] => !custom
    [2] => 1
)
Array
(
    [x] => y
)

从那以后我可以说几件事:

  • 回调查找中使用的密钥是PHP-YAML的predefined constants之一或YAML源中使用的自定义标记,包括感叹号
  • 地图中的每个键值都会被“标记”并传递给匹配的回调,这可能是因为根据YAML规范,该键也可以是任何有效类型。
  • 将三个参数传递给回调:标记的“主题”,标记本身和一些数字,可能对应于YAML_*_SCALAR_STYLE常量。
  • 回调的返回值替换标记的数据结构

任何人都可以确认此功能的预期行为吗?

1 个答案:

答案 0 :(得分:4)

经过大量的研究和测试,我找到了一些答案。

如扩展名unit tests中所示,每个回调都有三个参数:

  • mixed $data - 已解析的已标记数据
  • string $tag - 根据offical YAML tag specs展开的代码名称:
      如果未定义任何标记前缀,则
    • !custom会扩展为!custom
    • !custom扩展为prefixcustom,其中prefix由文档元数据%TAG ! prefix定义。请注意是一个领先的感叹号
    • !!preset扩展为解析器定义的内部类型。请参阅YAML_*_TAG常量
    • !<verbatim-tag> expands to逐字-tag`。请注意,是一个主要的感叹号。
  • integer $style - 使用的标量样式。请参阅YAML_*_SCALAR_STYLE常量

回调应返回一个混合值,供解析器发出。