mefworks/string-interpolation

通过用数组中的数据替换占位符来插值字符串。

v1.0.0 2014-10-18 04:30 UTC

This package is auto-updated.

Last update: 2024-09-09 13:34:35 UTC


README

Total Downloads Latest Stable Version

mef\StringInterpolation 定义了一个接口 StringInterpolationInterface,它描述了一种将任意数据数组与字符串组合的方法,类似于 PHP 方法 vsprintfstrtr

PlaceholderInterpolator 的核心实现将 {0}{key} 替换为上下文数组中对应的值,但接口的其他实现可以自由使用任何语法。

建议插值器使用 mef\Stringifier 来将上下文数组中的非字符串值转换为字符串。

示例

PlaceholderInterpolator

<?php
$stringifier = new mef\Stringifier\Stringifier;
$interpolator = new mef\StringInterpolation\PlaceholderInterpolator($stringifier);

echo $interpolator('Hello, {name}!', ['name' => 'Matthew']), PHP_EOL;

echo $interpolator->getInterpolatedString('Index based 0: {0}, 1: {1}', ['one', 'two']), PHP_EOL;

示例输出

Hello, Matthew!
Index based 0: one, 1: two

Stringifier 负责将数组中的值转换为字符串。在这种情况下,所有值已经是字符串,所以这是一个有点不相关的细节。请注意,函数调用(第一个 echo)来自 AbstractStringInterpolator,并不保证在所有插值器中存在,因为接口没有要求它。

更完整的示例可在 examples 目录中找到。

概述

mef\StringInterpolation\StringInterpolatorInterface 描述了两种方法

<?php namespace mef\StringInterpolation;

interface StringInterpolatorInterface
{
	/**
	 * Given a string and an array of context, return a new Interpolation
	 * record, from which the interpolated string and unused context can be
	 * retrieved.
	 *
	 * The implementation details are left undefined.
	 *
	 * @param  string $string  The string to interpolate
	 * @param  array|mef\StringInterpolation\ContextInterface $context
	 *
	 * @return mef\StringInterpolation\InterpolationInterface
	 */
	public function interpolate($string, $context);

	/**
	 * Given a string and an array of context, return a new string with that
	 * context embedded in it.
	 *
	 * This MUST always give the same results as:
	 *
	 * ->interpolate($string, $context)->getString()
	 *
	 * This variation should be optimized when possible, as there's no need to
	 * create an Interpolation object or track unused context.
	 *
	 * @param  string $string  The string to interpolate
	 * @param  array|mef\StringInterpolation\ContextInterface $context
	 *
	 * @return string
	 */
	public function getInterpolatedString($string, $context);
}

两种方法执行相同的底层操作。 getInterpolatedString(...) 返回与 interpolate(...)->getString() 相同的内容,但速度稍快,因为不需要创建 Interpolation 对象,并且不需要更新上下文。

插值器对象由此接口定义

<?php namespace mef\StringInterpolation;

interface InterpolationInterface
{
	/**
	 * The interpolated string.
	 *
	 * @return string
	 */
	public function getString();

	/**
	 * The used context.
	 *
	 * @return array
	 */
	public function getUsedContext();
}

上下文

提供给插值器的上下文可以是本机 PHP 数组或实现 ContextInterface 的对象。

  • ArrayContext - 将数组包装成实现 ContextInterface 的对象。

插值器

  • ExpressionInterpolator - 将 {key}{0} 视为占位符,并使用字符串插值器将它们替换为上下文数组中的对应值。值可以通过突变输出进行过滤。例如,{key|uppercase}
  • IndirectInterpolator - 一个装饰器,在将其传递给内部插值器之前,从 ArrayAccess 对象中查找字符串格式。用于创建资源包很有用。
  • PlaceholderInterpolator - 与 ExpressionInterpolator 类似,但不支持表达性语法。
  • PrintFInterpolator - 使用 printf 样式的插值。

许可证

版权所有 (C) 2014 Matthew Leverton

特此授予任何获得此软件及其相关文档副本(“软件”)的人,无限制地处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向提供软件的人这样做,但受以下条件约束

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何形式的保证,明示或暗示,包括但不限于适销性、针对特定目的的适用性和非侵权性。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论该责任是基于合同、侵权或其他原因,是否源于、源于或与软件或软件的使用或其他交易有关。