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

Aus*_*yde 5 php yaml

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

mixed yaml_parse ( string $input [, int $pos = 0 [, int &$ndocs [, array $callbacks ]]] )
Run Code Online (Sandbox Code Playgroud)

回调
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';
  }
)));
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出:

$ 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
)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Aus*_*yde 4

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

正如在扩展的单元测试中发现的那样,每个回调都采用三个参数:

  • mix $data - 已解析的标记数据
  • string $tag - 标签名称,根据官方 YAML 标签规范进行扩展:
    • !custom!custom如果没有定义标签前缀则扩展为
    • !custom扩展为prefixcustom,其中prefix是由文档元数据 定义的%TAG ! prefix请注意,没有前导感叹号
    • !!preset扩展为解析器定义的内部类型。查看YAML_*_TAG常数
    • !<verbatim-tag> expands to 逐字标记`。请注意,没有前导感叹号。
  • 整数 $style- 使用的标量样式。查看YAML_*_SCALAR_STYLE常数

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