首页 > 解决方案 > 如何动态缝合带有变量的模板?

问题描述

我试图让用户定义要传递到字符串中的值。

如何在不使用 eval() 或必须静态定义所有变量的情况下使用模板动态拼接一些变量?

我正在寻找一个小脚印解决方案。不包括整个模板引擎或库。

<?php

// Create a template
  $tpl = " ... {$var['a']} ... "; // User defined content

// State variables
  $var = [
    'a' => 1,
    'b' => 2,
  ];

// Stitch
  echo $tpl;

因此,PHP 是一种对别名/变量替换进行后期处理的方法。

我想也许 http_build_query() 可能有助于生成一堆与 strtr() 一起使用的别名。但这样做感觉不干净或不合适。

像这样的东西,支持递归数组会做:

<?php
  echo strtr(' ... {a.1} ...', $var);

标签: phparraystemplates

解决方案


只需更改您的替换格式:

<?php

$tpl = "Dear @name@, I would love to come to @location@."; 

$subs =
[
    '@name@'     => 'Julian',
    '@location@' => 'Freetown'
];    

echo strtr($tpl, $subs);

输出:

Dear Julian, I would love to come to Freetown.

或者一个围绕 strtr 的包装器:

function template($template_str, array $vars) {
    foreach($vars as $k => $v)
        $substitutes['@'.$k.'@'] = $v;
    return strtr($template_str, $substitutes);
}

$tpl = "Dear @name@, I would love to come to @location@."; 

$subs = [
    'name'     => 'Julian',
    'location' => 'Freetown'
];

echo template($tpl, $subs);

推荐阅读