在PHP字符串中强制替换变量

时间:2015-01-27 17:12:53

标签: php

有没有办法强制字符串进行评估(如双引号字符串/ heredoc那样)?

例如,有一些干净的方法:

<?php
$mystring = <<<'MS'
hello {$adjectives['first']} world
MS;

$adjectives = array('first'=>'beautiful');

// here I want to print 'hello beautiful world' 
// instead of 'hello {$adjectives['first']} world'
echo evaluate($mystring); // evaluate is not a real function
?>

3 个答案:

答案 0 :(得分:1)

您可以使用eval,因为您打算仅在自己创建的字符串上使用它。如果字符串(或替代品)超出您的控制范围,请不要使用eval

$mystring = <<<'MS'
hello %s world
MS;

$adjectives = array('first'=>'beautiful');

eval('$parsed = ' . json_encode($mystring) . ';');
echo($parsed);

请参阅http://sandbox.onlinephpfunctions.com/code/b1f6afc24efbc685f738dc1e7fd3668afdf5b7d0

正如NATH所建议的那样,sprintf会为你完成工作而不会产生eval的安全隐患

$mystring = <<<'MS'
hello %s world
MS;

$adjectives = array('first' => 'beautiful');
echo sprintf($mystring, $adjectives['first']);

答案 1 :(得分:1)

我强烈建议避免使用eval()。我认为这一般是危险的,缓慢的,也是一种不好的做法。使用vsprintf()代替应该为你做的伎俩。

// Use argument swapping (%1\$s instead of %s) to explicitly specify which
// position in the array represents each value. Useful if you're swapping out
// multiple values.
$mystring = <<<MS
hello %1\$s world
MS;

$adjectives = array('first'=>'beautiful');

echo vsprintf($mystring, $adjectives);

答案 2 :(得分:0)

是的,你几乎得到了它。

请查看eval @ php.net

的示例
<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";
?>

但请注意,使用eval是危险的,如果处理不当,可能会发生各种攻击。

也许更好的解决方案是使用某种占位符。

$str = "This is a __first__ world";

$adjectives = array('first'=>'beautiful');

foreach ($adjectives as $k=>$v) {
   $str = preg_replace('/__'.$k.'__/', $v, $str); 
}

echo $str;