PHP变量替换

4
有没有一个函数可以替换字符串中的参数?就像这样:
代码:
$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。但在这种情况下不够用。我已经修改了代码以展示差异。

可能是作者的错误 - Jonathan Fingland
8个回答

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.

这看起来正是所需之物。 - Christian

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
我怎么会被踩了呢?我本来想讲sprintf的,但从他提问的方式来看,似乎他想要唯一标识符而不仅仅是%s。我因为读懂问题而被踩了。-_- - Ozzy
1
与您的答案类似,更接近他想要的是:http://au2.php.net/manual/en/function.sprintf.php#83779,请参见sprintf3的示例。 - Stobor
谢谢提供链接。我会更新我的回答,让它更符合他的要求。 - Ozzy
2
str_replace的问题在于它会替换掉已经被替换过的内容。例如,尝试执行以下代码:$str = xprintf('My name is %first %last', array('first' => '%last', 'last' => 'Smith')); 你应该得到的结果是'My name is %last Smith',但实际上你得到的是'Smith Smith'。使用strtr可以避免这个问题。 - rojoca

2

您是指sprintf()函数吗?

$str = sprintf("我的名字是%s。", 'Joe');


0

这个函数,“map”(和替换),是我网站应用系统的一部分:

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}');

我更喜欢它胜过百分号语法。


0

-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感到不满之前,只要您对输入模板字符串有控制权,我无法看出这可能会成为安全问题。


-1

PHP可以不使用sprintf()从数组中提取值:

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

无济于事 - 需要能够处理实际包含%后跟单词的字符串,其中字符串值在替换值之前设置。 - thomasrutter

-1

试试使用printf()。那个网站有很多使用printf和数组的例子。

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

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