假设我有这个:
$t = "This %var% should be replaced";
$newText = preg_replace('/%(.+?)%/', "$1", $t);
它的作用是替换var的%var%,因此文本变为:
This var should be replaced.
但我想要做的是有一个名为$ var的变量,然后用$ var替换“%var%”。
我们知道我们可以像这样创建变量变量:
$foo = "one";
$$foo = "two"
echo $one; //prints "two"
如果您对此不了解,那么您可能无法回答我的问题。但您可以在http://www.php.net/manual/en/language.variables.variable.php
上阅读有关变量变量的更多信息嗯,在这种情况下,这不起作用。如果我这样做:
$t = "This %var% should be replaced";
$newText = preg_replace('/%(.+?)%/', $"$1", $t);
我收到错误。
我也尝试过这样:
$t = "This %var% should be replaced";
$newText = preg_replace('/%(.+?)%/', ${$1}, $t);
我又得到了一个错误。
问题是:我如何创建一个变量变量来将%var%替换为$ var?
的值有些人可能会问为什么不这样做:
$t = "This %var% should be replaced";
$newText = preg_replace('/%(.+?)%/', $var, $t);
原因很简单。我的文字比这复杂得多。让它变得更有趣,好吗?
$text = "This %var% should be replaced, just like this %foo%;
$newText = preg_replace('/%(.+?)%/', "$1", $text);
如您所见,我们需要将$ var%替换为$ var,将%foo%替换为$ foo。
我已经解决了这个问题,但方式不同了。但我仍然想知道如何以这种方式解决它,因为代码更具可读性。如果无法解决问题,为什么呢?
感谢您的回答和兴趣。就像我说的那样我已经以不同的方式解决了问题,是的,我使用了preg_repace_callback。我不是在寻找问题的解决方案,而是为了解释为什么不能从反向引用中创建变量变量。对不起,如果我的问题令人困惑,或写得不好,让你们认为我还在寻找如何实现目标的解决方案。
如果你想看看我是如何解决它的,你可以去我的博客,我昨天在那里发布了这个:http://imbuzu.wordpress.com/2012/02/07/back-references-in-php-how-to-create-variable-variables-using-them/
再次。我不是在寻找一种方法来做到这一点,而是为了解释为什么不可能按照我最初的预期做到这一点。为什么不能从反向引用创建变量变量?
致管理员。此回复是对上述所有答案的一般回复。如果您要编辑它并将其作为注释添加到其中任何一个,请将其添加到所有这些,或者至少通知用户此回复。感谢。
答案 0 :(得分:1)
关联数组怎么样?
$replacement = array('var' => 'value1',
'foo' => 'value2');
$text = "This %var% should be replaced, just like this %foo%";
$newText = preg_replace('/%(.+?)%/', $replacement[$1], $text);
答案 1 :(得分:0)
您可以使用preg_replace_callback()
:
$var = '[replaced]';
function handler($found)
{
if ( isset($GLOBALS[$found[1]]) )
return $GLOBALS[$found[1]];
else
return $found[0];
}
$text = 'This %var% should be replaced and this %var2% will not be replaced!';
$newText = preg_replace_callback('/%(.+?)%/', 'handler', $text);
echo $newText;
这输出以下内容:
这个[替换]应该被替换,这个%var2%不会被替换!
答案 2 :(得分:0)
您必须使用preg_X函数和eval调用创建一个小解析器。有了这些成分,你可以做这样的事情:
<?php
$var = 'world';
$end = '.';
$t = "This %var% should be replaced%end%";
//We should escape " character
$t = str_replace('"','\"',$t);
$php = $t;
do
{
$orig_php = $php;
$php = preg_replace('/%([^%]+)%/','$\\1',$t);
} while($php!=$orig_php);
eval('$output="'.$php.'";');
echo($output);
?>
这是一个很小的模板引擎