php - 如何动态缝合带有变量的模板?
问题描述
我试图让用户定义要传递到字符串中的值。
如何在不使用 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);
解决方案
只需更改您的替换格式:
<?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);
推荐阅读
- javascript - 使用 react-router 自定义动态路由
- excel - 使用带有 BeforeClose 的 msgbox 将数据导出到另一个工作簿
- search - Google Places API 可以进行模糊搜索吗
- python - 调用命令然后写入同一个子进程
- excel - 如何解决 VBA 中工作簿之间的复制和粘贴问题?
- ios - Apple 是否允许从 Web 应用程序购买内容?
- selenium - 如何在文本框中为 Selenium 中的蛋 99 发送两次号码
- r - 在R中的轴上添加一条独立于y的线
- javascript - 是否有 JS 函数或方法以 4 位格式返回数字?
- android - 即使一个 Observable 发出 onError 也将两个 observable 合并为 List 并返回值