2012-02-07 2 views
1

Предположим, у меня есть это:Можно ли создать переменную переменную из обратной ссылки в php?

$t = "This %var% should be replaced"; 
$newText = preg_replace('/%(.+?)%/', "$1", $t); 

Что это делает заменить% 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% со значением $ вар и% Foo% со значением $ Foo.

Я уже решил проблему, но по-другому. Но мне все еще интересно, как можно было бы решить это таким образом, поскольку код более читабельен. Если это невозможно решить, то почему?


Спасибо за ваши ответы и интерес. Как я уже сказал, я уже решил проблему по-другому, и да, я использовал preg_repace_callback. Я не ищу решение проблемы, но для объяснения причин невозможности создания переменной переменной из обратной ссылки. Извините, если мой вопрос был запутан или плохо написан, и вы решили, что я все еще ищу решение о том, как достичь своей цели.

Если вы хотите увидеть, как я ее решил, вы можете пойти в мой блог, я разместил там вчера об этом: http://imbuzu.wordpress.com/2012/02/07/back-references-in-php-how-to-create-variable-variables-using-them/

снова. Я не ищу способ сделать это, а скорее объясню, почему это невозможно сделать так, как я изначально планировал. Почему вы не можете создать переменную переменную из обратной ссылки?

Для админов. Этот ответ является общим ответом на все ответы выше.Если вы собираетесь отредактировать его и добавить в качестве комментария к любому из них, добавьте его ко всем из них или, по крайней мере, сообщите пользователям этого ответа. Благодарю.

+4

Почему бы вам не просто использовать preg_replace_callback? - как в стороне, приведенный выше код не особенно поддается повторению, учитывая то, что вы пытаетесь сделать. – AD7six

ответ

1

А как насчет ассоциативного массива?

$replacement = array('var' => 'value1', 
        'foo' => 'value2'); 
$text = "This %var% should be replaced, just like this %foo%"; 
$newText = preg_replace('/%(.+?)%/', $replacement[$1], $text); 
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% не будут заменены!

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

?> 

Это крошечное шаблонный движок

Смежные вопросы