regex — заменить на переменную 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
...

-1

Решение

Согласно желанию ОП опубликовать мой комментарий в качестве ответа:

Для того, чтобы это работало, вам нужно изменить [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]"

4

Другие решения

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

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

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

1

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

$name = "Simon";
$string = "My name is {$name}.";
0
По вопросам рекламы [email protected]