【问题标题】:How to use PHP-YAML's custom tag callbacks?如何使用 PHP-YAML 的自定义标签回调?
【发布时间】:2011-09-22 08:23:54
【问题描述】:

根据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 常量。
  • 回调的返回值替换了标记的数据结构

谁能确认这个函数的预期行为?

【问题讨论】:

    标签: php yaml


    【解决方案1】:

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

    在扩展的unit tests 中可以找到,每个回调都需要三个参数:

    • 混合 $data - 标记数据,已解析
    • 字符串 $tag - 标签名称,根据offical YAML tag specs 展开:
      • 如果未定义标签前缀,!custom 将扩展为 !custom
      • !custom 扩展为prefixcustom,其中prefix 由文档元数据%TAG ! prefix 定义。请注意,不是前导感叹号
      • !!preset 扩展为解析器定义的内部类型。请参阅YAML_*_TAG 常量
      • !&lt;verbatim-tag&gt; expands toverbatim-tag`。请注意,不是前导感叹号。
    • 整数 $style - 使用的标量样式。请参阅YAML_*_SCALAR_STYLE 常量

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      相关资源
      最近更新 更多