我的例子:
$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 :(得分: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]"
答案 1 :(得分: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'));
但是你总是要小心,你正确地逃避了占位符格式化。 我只是删除它:)
答案 2 :(得分:0)
根本不需要preg_replace
无论如何你使用variable_names - 所以php已经有了这个占位符 - "{$var}"
:
$name = "Simon";
$string = "My name is {$name}.";