vsprintf 或 sprintf 与命名参数,或 PHP 中的简单模板解析

我正在寻找一种使用或 的命名参数的方法。sprintfprintf

例:

sprintf(
  'Last time logged in was %hours hours, 
   %minutes minutes, %seconds seconds ago'
  ,$hours,$minutes, $seconds
);

或 via 和关联数组。vsprintf

我在这里找到了一些编码示例

function sprintfn ($format, array $args = array())

http://php.net/manual/de/function.sprintf.php

和这里

function vnsprintf( $format, array $data)

http://php.net/manual/de/function.vsprintf.php

人们编写了自己的解决方案。

但我的问题是,有没有一个标准的PHP解决方案来实现这一点,或者有没有另一种方法,也许通过PEAR提供的简单PHP模板,我可以通过坚持标准PHP来实现这一点?

感谢您的任何帮助。


答案 1

迟到,但你可以简单地使用strtr来“翻译字符或替换子字符串”

<?php

$hours = 2;
$minutes = 24;
$seconds = 35;

// Option 1: Replacing %variable
echo strtr(
    'Last time logged in was %hours hours, %minutes minutes, %seconds seconds ago',
    [
        '%hours' => $hours,
        '%minutes' => $minutes,
        '%seconds' => $seconds
    ]
);

// Option 2: Alternative replacing {variable}
echo strtr(
    'Last time logged in was  {hours} hours, {minutes} minutes, {seconds} seconds ago',
    [
        '{hours}' => $hours,
        '{minutes}' => $minutes,
        '{seconds}' => $seconds
    ]
);

// Option 3: Using an array with variables:
$data = [
    '{hours}' => 2,
    '{minutes}' => 24,
    '{seconds}' => 35,
];

echo strtr('Last time logged in was {hours} hours, {minutes} minutes, {seconds} seconds ago', $data);

// More options: Of course you can replace any string....

输出以下内容:

上次登录时间是 2 小时, 24 分钟, 35 秒 前


答案 2

我已经为这个需求编写了一个小组件。它被称为StringTemplate。有了它,你可以用这样的代码得到你想要的东西:

$engine = new StringTemplate\Engine;

$engine->render(
   'Last time logged in was {hours} hours, {minutes} minutes, {seconds} seconds ago',
   [
      'hours' => '08',
      'minutes' => 23,
      'seconds' => 12,
   ]
);
//Prints "Last time logged in was 08 hours, 23 minutes, 12 seconds ago"

希望能有所帮助。


推荐