替换为相同的命名PHP变量

时间:2014-11-20 17:48:33

标签: php regex variables preg-replace preg-replace-callback

我的例子:

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

3 个答案:

答案 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}.";