Можно ли создать переменную переменную из обратной ссылки в php? - PullRequest
1 голос
/ 07 февраля 2012

Предположим, у меня есть это:

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

1 голос
/ 07 февраля 2012

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

$replacement = array('var' => 'value1',
                     'foo' => 'value2');
$text = "This %var% should be replaced, just like this %foo%";
$newText = preg_replace('/%(.+?)%/', $replacement[$1], $text);
0 голосов
/ 07 февраля 2012

Вы должны создать небольшой анализатор с функциями 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);

?>

Это крошечный шаблонизатор

0 голосов
/ 07 февраля 2012

Вы можете использовать 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% не будет заменен!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...