2014-11-20 2 views
-1

Мой пример:Заменить же именем переменной PHP

$name = "Simon"; 
$string = "My name is [name]."; 
echo preg_replace("/\[(.*)]/", ${"$1"}, $string); 
// Expected: My name is Simon. 
// I get: My name is . 
// ${"$1"} should be $name? 
exit(); 

Когда я только:

echo preg_replace("/\[(.*)]/", "$1", $string); 
// I get: My name is name. 
// $1 = name 

Что я делаю не так? Почему PHP не использует сгенерированный $ name var? Это только пример. Я хотел бы работать это с какой-либо замены:

[foo] --> $foo 
[bar] --> $bar 
... 
+0

echo str_replace ("[name]", $ name, $ string); – Asik

+0

Эй, Асик, я не хочу использовать str_replace, потому что я хочу сделать это с гораздо большим количеством варов. Я хочу работать с любой заменой. '[foo]> $ foo',' [bar]> $ bar' и т. д. Я не хочу использовать массивы. – user2987790

+1

Есть ли особая причина, по которой вы хотите использовать 'preg_replace()' и т. Д., А не просто '$ string =" My name is ". $ Name;'? Это звучит как overkill, если вы просто хотите вывести/заполнить имя пользователя. –

ответ

4

По желанию OP, чтобы опубликовать свой комментарий в качестве ответа:

Для того, чтобы это работало, вам нужно будет изменить [name] к [$name] и ${"$1"} к "$1"

$name = "Simon"; 
$string = "My name is [$name]."; 

echo preg_replace("/\[(.*?)]/", "$1", $string); 

PHP нуждается в переменной идти дальше, так что использование [name] не заселяется.


В соответствии с another and earlier comment я сделал, в качестве альтернативы вы могли бы сделать очень хорошо:

$name = "Simon"; 
$string = "My name is " .$name; 

echo $string; 

Если у вас есть рамки с существующими кронштейнами, то это то, что вы не сказали нам, только то, что вам сказал в комментариях:
«есть намного больше Заместителей, не только [name]», будь то часть чего-то большего, а затем придерживаться принятого метода.


В соответствии в комментариях, вы можете использовать в качестве альтернативы "/\[([^\]]+)\]/" вместо "/\[(.*)]/"
Или "/[(.*?)]/" :)

относительно использования, например: "[$foo]bar[$foo]"

+0

Что у dv? –

+0

Если я объясню это плохо/неправильно, я отрегулирую свой ответ. –

+0

'preg_replace' удалить квадраты? шутки в сторону? –

0

Нет необходимости в preg_replace.
Вы используете variable_names в любом случае - так PHP уже есть эти заполнители - "{$var}":

$name = "Simon"; 
$string = "My name is {$name}."; 
+0

Вот что [** я написал **] (http://stackoverflow.com/questions/27046192/replace-with-same-named-php-variable#comment42610960_27046192), но ОП, похоже, хочет использовать это для конкретного причина. Почему, я понятия не имею. –

+0

В поле mysql я храню текст, смешанный с PHP Vars: 'bla $ foo bla $ bar'. Если я сохраню этот результат mysql и повторю его, я получаю то же самое: 'bla $ foo bla $ bar'. если я сохраняю текст с помощью заполнителей '[foo], [bar]' и изменяет их позже на $ PHPVars, результат должен быть 'bla FOOVAR-CONTENT bla BARVAR-CONTENT' (Прежде чем я повторю mysql, вары уже установлены в скрипте) – user2987790

+0

У меня есть только facepalm для вас ... –

1

я предлагаю вам использовать что-то вроде этого:

class Tpl { 
    private $tpl; 
    public function __construct($tpl) { 
    $this->tpl = $tpl; 
    } 
    public function render($data) { 
    $result = $this->tpl; 
    foreach ($data as $key => $value) { 
     $result = str_replace("%%$key%%", str_replace('%%', '', $value), $result); 
    } 
    return $result; 
    } 
} 

$greet = new Tpl('Hello, %%name%%'); 
echo $greet->render(array('name' => 'World')); 

Но вы всегда должны заботиться, что вы правильно бежать ваш форматирование заполнителя. Я просто удалю его :)

+0

Наконец, я отформатировал vars в mysql с помощью заполнителей {{FOO}} и использовал [strtr()] (http://stackoverflow.com/questions/ 10106052/заменить многодисковых заполнители-с-PHP). Спасибо за вашу помощь! Таким образом, нет возможности хранить «реальные» php Vars, смешанные с Text в mysql? Я понимаю это с точки зрения вопросов безопасности, но должен быть и возможность этого. – user2987790

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