PHP变量替换

时间:2009-06-09 02:56:59

标签: php

是否有任何函数替换字符串中的params?像这样:

代码:

$format_str = "My name is %name."; /* this was set in a 
                                      configuration file - config.php */

$str = xprintf($format_str, array('name' => 'Joe', 'age' => 150)); 
              /* above is somewhere in main code */

操作后$ str的预期值为:

My name is Joe.

更新:我知道sprintf。但是,在这种情况下,这还不够。我修改了代码以显示有什么区别。

8 个答案:

答案 0 :(得分:10)

似乎strtr是内置函数,它可以做同样的事情。 (通过drupal代码得到这个)。

>> $format_str = "My name is %name.";
My name is %name.
>> strtr($format_str, array('%name' => 'Joe', '%age' => 150))
My name is Joe.

答案 1 :(得分:3)

你可以用这个:

function xprintf($str, $array, $chr = '%') {

   foreach ($array as &$key => $val) {
       $key = $chr . $key;
   }

   return strtr($str, $array);
}

$str = xprintf('My name is %name', array('name' => 'Joe'));

答案 2 :(得分:2)

您的意思是sprintf()吗?

$ str = sprintf(“我的名字是%s。”,“乔”);

答案 3 :(得分:0)

此功能“map”(和替换)是我的Web应用程序系统的一部分:

function replace($search, $replace, $mixed)
{
    if (is_string($mixed)) {
        return @str_replace($search, $replace, $mixed);
    } else if (is_array($mixed)) {
        foreach ($mixed as $k => $v) {
            $mixed[$k] = replace($search, $replace, $v);
        }
        return $mixed;
    } else {
        return $mixed;
    }
}


function map($a, $contents, $case_sensitive=false)
{
    if (!is_array($a)) {
        return $contents;
    }
    if (!$case_sensitive) {
        $a = array_change_key_case($a);
    }
    $s = array();
    $r = array();
    foreach ($a as $k => $v) {
        if (is_scalar($v) || empty($v)) {
            $s[] = "{".$k."}";
            $r[] = $v;
        }
    }
    if (!$case_sensitive) {
        $contents = preg_replace_mixed('/{([-_ =,.\/\'"A-Za-z0-9]+)}/ei', "'{'.strtolower('\\1').'}'", $contents);
    }
    return replace($s, $r, $contents);
}

做得很好。提供带有括号变量名称的任何字符串,它就可以实现。

语法不同,但可以根据您的目的进行修改:

$str = map(array('name' => 'Joe'), 'My name is {name}');

我比%语法更喜欢它。

答案 4 :(得分:0)

您正在寻找 vsprintf http://us2.php.net/vsprintf

它允许您按照指示传递一组参数。

答案 5 :(得分:-1)

尝试给printf()一个旋转。该网站有很多使用printf数组的例子。

printf("My name is %s", "Joe"); 

答案 6 :(得分:-1)

你总是可以使用eval ... (喘息!)

$myStr = 'Hi my name is $name. I\'m $age years old.';
$myVars = array("name" => "Joe", "age" => 6);
$parsed = parseString($myStr, $myVars);

function parseString($str, $vars) {
    extract($vars);
    return eval('return "' . addslashes($str) . '";');
}

在任何人对使用extracteval感到不自在之前,只要你能控制输入模板字符串,我就看不出这可能是一个安全问题。

答案 7 :(得分:-1)

PHP可以在不使用sprintf()的情况下从数组中提取值:

$data = array('name' => 'Joe', 'age' => 150);
print "My name is $data[name], my age is $data[age].";