首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:将字符串变量中的占位符替换为相应的定义变量值

问PHP:将字符串变量中的占位符替换为相应的定义变量值
EN

Stack Overflow用户
提问于 2015-11-23 21:55:04
回答 6查看 180关注 0票数 1

我有一个PHP脚本,在全局命名空间中设置了一些变量:

代码语言:javascript
复制
$domain = 'example.com';
$hostname = 'www.' . $domain;

我使用目录将外部文件读入脚本中的字符串变量

代码语言:javascript
复制
$file_contents = file_get_contents('external_file.tpl');

外部文件(和字符串$file_contents)包含与变量名称对应的占位符。

代码语言:javascript
复制
127.0.0.1 {{domain}} {{hostname}}

我希望将变量$file_contents中的所有占位符替换为它们各自的已设置的PHP变量。我希望它能通用地工作(没有硬编码占位符/变量名)。我不想编辑文件,只想编辑字符串的内容。

做这件事最简单的方法是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-11-23 22:43:14

好吧,伙计们,我从其他答案中拿出了一些零碎的东西,并想出了我认为最好的解决方案:

代码语言:javascript
复制
$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也对他的评论有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2015-11-23 22:14:31

  • 解析{{和}之间项的文件
  • 检查是否存在全局变量
  • 搜索和替换

就像这样:

代码语言:javascript
复制
$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);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-11-23 22:16:18

免责声明:--我不认为允许在这个模板中使用任意变量是个好主意。

函数get_defined_vars()在表单variable_name => value中创建一个包含所有当前可用变量的数组(,包括超级$_SERVER和$_GET!)

字符串转换函数strtr(string $str, array $replace_pairs)可以用字符串中的值替换关联数组的键。

他们一起组成了一个强大但危险的联盟。下面的代码将将domain替换为$domain的值,等等:

代码语言:javascript
复制
echo strtr(file_get_contents('external_file.tpl'), get_defined_vars());

添加{{...}}是可能的,只需付出一点额外的努力:

代码语言:javascript
复制
$vars = get_defined_vars();
$replace = array();
foreach ($vars as $key => $value) {
    $replace['{{' . $key . '}}'] = $value;
}
echo strtr(file_get_contents('external_file.tpl'), $replace);

负责任地使用它!记住不要信任任何用户输入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33881440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档