我有一个PHP脚本,在全局命名空间中设置了一些变量:
$domain = 'example.com';
$hostname = 'www.' . $domain;我使用目录将外部文件读入脚本中的字符串变量
$file_contents = file_get_contents('external_file.tpl');外部文件(和字符串$file_contents)包含与变量名称对应的占位符。
127.0.0.1 {{domain}} {{hostname}}我希望将变量$file_contents中的所有占位符替换为它们各自的已设置的PHP变量。我希望它能通用地工作(没有硬编码占位符/变量名)。我不想编辑文件,只想编辑字符串的内容。
做这件事最简单的方法是什么?
发布于 2015-11-23 22:43:14
好吧,伙计们,我从其他答案中拿出了一些零碎的东西,并想出了我认为最好的解决方案:
$domain = 'example.com';
$hostname = 'www.' . $domain;
$file_contents = '127.0.0.1 {{domain}} {{hostname}}';
$result = preg_replace_callback(
"/{{(.+?)}}/",
function ($matches) {
return $GLOBALS[$matches[1]];
},
$file_contents
);这个答案结合了“TonyDeStefano”、“dops”和“fschmengler”的观点。所以请-投票给他们。@BugaDániel也对他的评论有所帮助。
发布于 2015-11-23 22:14:31
就像这样:
$matches = array();
preg_match('/\{\{([a-zA-Z0-9_]+)\}\}/', $file_contents, $matches);
foreach ($matches as $match)
{
// You might want to check to make sure the variable is a string
if (isset($GLOBALS[$match]))
{
str_replace('{{'.$match.'}}', $GLOBALS[$match], $file_contents);
}
}发布于 2015-11-23 22:16:18
免责声明:--我不认为允许在这个模板中使用任意变量是个好主意。
函数get_defined_vars()在表单variable_name => value中创建一个包含所有当前可用变量的数组(,包括超级$_SERVER和$_GET!)
字符串转换函数strtr(string $str, array $replace_pairs)可以用字符串中的值替换关联数组的键。
他们一起组成了一个强大但危险的联盟。下面的代码将将domain替换为$domain的值,等等:
echo strtr(file_get_contents('external_file.tpl'), get_defined_vars());添加{{...}}是可能的,只需付出一点额外的努力:
$vars = get_defined_vars();
$replace = array();
foreach ($vars as $key => $value) {
$replace['{{' . $key . '}}'] = $value;
}
echo strtr(file_get_contents('external_file.tpl'), $replace);负责任地使用它!记住不要信任任何用户输入。
https://stackoverflow.com/questions/33881440
复制相似问题