Мой пример:
$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
...
Согласно желанию ОП опубликовать мой комментарий в качестве ответа:
Для того, чтобы это работало, вам нужно изменить [name]
в [$name]
а также ${"$1"}
в "$1"
$name = "Simon";
$string = "My name is [$name].";
echo preg_replace("/\[(.*?)]/", "$1", $string);
PHP нужен переменный, чтобы использовать [name]
не заселен.
Согласно другой и более ранний комментарий Я сделал, в качестве альтернативы вы могли бы очень хорошо сделать:
$name = "Simon";
$string = "My name is " .$name;
echo $string;
Если у вас есть структура с существующими скобками, то вы не сказали нам об этом, только то, что вы сказали в комментариях:
«есть гораздо больше заполнителей, не только [name]
«, будь то часть чего-то большего, тогда придерживайтесь принятого метода.
Согласно в комментариях, вы могли бы альтернативно использовать "/\[([^\]]+)\]/"
вместо "/\[(.*)]/"
Или же «/[(.*?)]/» 🙂
в отношении использования, например: "[$foo]bar[$foo]"
Я предлагаю вам использовать что-то вроде этого:
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'));
Но вы всегда должны заботиться о том, чтобы правильно избежать форматирования заполнителя.
Я просто удаляю это 🙂
Нет необходимости в preg_replace
совсем.
В любом случае вы используете переменные-имена — так что php уже имеет эти заполнители — "{$var}"
:
$name = "Simon";
$string = "My name is {$name}.";