是否可以从php中的后引用创建变量变量?

时间:2012-02-07 08:53:16

标签: php variables regex

假设我有这个:

$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/

再次。我不是在寻找一种方法来做到这一点,而是为了解释为什么不可能按照我最初的预期做到这一点。为什么不能从反向引用创建变量变量?

致管理员。此回复是对上述所有答案的一般回复。如果您要编辑它并将其作为注释添加到其中任何一个,请将其添加到所有这些,或者至少通知用户此回复。感谢。

3 个答案:

答案 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);

?>

这是一个很小的模板引擎