替换字符串中的变量

20

我正在使用PHP开发一个多语言的网站,在我的语言文件中经常有包含多个变量的字符串,这些变量稍后将被填入以完成句子。

目前,我在字符串中放置{VAR_NAME}并在使用时手动替换每个出现的变量名,用相应的值进行匹配。

所以基本上:

{X}在{Y}上创建了一个主题

会变成:

Dany在 Stack Overflow 上创建了一个主题

我已经考虑过sprintf,但我认为它不方便,因为它取决于变量的顺序,而这种顺序可能因语言而异。

我已经查看了How replace variable in string with value in php?,目前我基本上使用这种方法。

但是,我想知道是否有一种内置的(或者说非内置的)方便的PHP方法来处理这个问题,因为在前面的示例中,我已经有了名为X和Y的变量,更像是变量变量 $$。

因此,我可能不会在字符串上执行str_replace,而是会调用类似如下的函数:

$X = 'Dany';
$Y = 'Stack Overflow';
$lang['example'] = '{X} created a thread on {Y}';

echo parse($lang['example']);

还会打印出:

Dany在Stack Overflow上创建了一个线程

谢谢!

编辑

这些字符串作为模板使用,可以使用不同的输入多次使用。

所以基本上做 "{$X} ... {$Y}" 不会奏效,因为我会失去模板,并且该字符串将使用尚未确定的$X$Y的起始值进行初始化。


还可以查看此答案中的第二个选项,它使用strtr来避免需要循环。[这是在稍后将其添加到本问题提及的链接的已接受答案中的。] - ToolmakerSteve
12个回答

0
如何将“变量”部分定义为一个数组,其中键对应于字符串中的占位符?
$string = "{X} created a thread on {Y}";
$values = array(
   'X' => "Danny",
   'Y' => "Stack Overflow",
);

echo str_replace(
   array_map(function($v) { return '{'.$v.'}'; }, array_keys($values)),
   array_values($values),
   $string
);

你的 array_map 确实引起了我的注意 :) 但我想再等一下,看看是否有一种不需要在每次调用时传递变量数组的方法可以实现。 - Dany Khalife

0
为什么不能在函数内部使用模板字符串?
function threadTemplate($x, $y) {
    return "{$x} created a thread on {$y}";
}
echo threadTemplate($foo, $bar);

因为我将不得不为每个模板创建一个函数,这很快就会失控 :) - Dany Khalife

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接