有没有办法强制字符串进行评估(如双引号字符串/ 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
?>
答案 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;