PHP用字符串替换字符串中的通配符(%s,%d)

时间:2014-06-28 07:56:33

标签: php

我有翻译功能t($var);

function t($word) {
    return $this->words[$word];
}

其中$this->words是数组

$this->words = array(
    'word1' => 'word',
    'word2' => 'something'
);

我使用的函数为<?php echo t('word1'); ?> 输出为:word

我的目标是使用通配符%s %d %f 将其替换为变量

示例:

$this->words = array(
    'word1' => 'word',
    'word2' => 'something',
    'sentence' => 'Hello, my name is %s. I am %d years old.'
);

然后将变量解析为t()函数。

<?php echo t('sentence', array('Mike', 99));

因此输出将是:Hello, my name is Mike. I am 99 years old.

到目前为止我的工作:

function t($word, $vars = array()) {
    foreach ($vars as $key) {
        if(is_string($key)){
            $this->words[$word] = str_replace ('%s', $key, $this->words[$word]);
        }
        if(is_int($key)) {
            $this->words[$word] = str_replace ('%d', $key, $this->words[$word]);
        }
        if(is_float($key)){
            $this->words[$word] = str_replace ('%f', $key, $this->words[$word]);
        }
    }
    return $this->words[$word];
}

但是这个函数并不适用于每种类型的变量。

2 个答案:

答案 0 :(得分:4)

我看过有人建议使用sprintf,但我个人建议使用vsprintfhttp://www.php.net/manual/en/function.vsprintf.php

function t($word, $vars = array()) {
  return vsprintf($this->words[$word], $vars);
}

这允许您传入一组变量,而不是将它们作为单独的参数传递。

一般来说,翻译函数会首先检查翻译,如果没有找到则只返回查找键。

function t($word, $vars = array()) {
  return isset($this->words[$word]) ? vsprintf($this->words[$word], $vars) : $word;
}

答案 1 :(得分:0)

您可以像下面这样定义t函数:

function t($array)
{
    return sprintf($array['sentence'],$array['word1'],$array['word1']);
}

数组是:

$array = array(
    'word1' => 'word',
    'word2' => 'something',
    'sentence' => 'Hello, my name is %s. I am %d years old.'
);

调用该函数:     echo t($ array);