2009-06-09 140 views
4

是否有任何函数可以替换字符串中的参数?事情是这样的:PHP变量替换

代码:

$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。但是,在这种情况下这还不够。我修改了代码以显示有什么不同。

+0

为什么社区Wiki? – 2009-06-09 03:17:09

+0

作者 – 2009-06-09 04:12:40

回答

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. 
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

Wtf可能是一个错误,为什么我得到downvoted。我会谈论sprintf,但从他问这个问题的方式来看,他似乎希望UNIQUE标识符不仅仅是%s。 我得到downvoted阅读的问题-_- – Ozzy 2009-06-09 03:04:28

+1

类似于你的答案,更像他之后的东西:http://au2.php.net/manual/en/function.sprintf.php#83779看例子sprintf3 – Stobor 2009-06-09 03:07:00

2

你的意思是sprintf()

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

-1

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

printf("My name is %s", "Joe"); 
-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():

​​
0

该功能, “地图”(和替换),是我的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}'); 

我喜欢它的语法%以上。