【问题标题】:Efficient way to replace placeholders with variables [duplicate]用变量替换占位符的有效方法[重复]
【发布时间】:2011-12-20 07:29:47
【问题描述】:

可能重复:
replace multiple placeholders with php?

我有一个 .txt 文件作为模板。我已经制作了几个占位符,例如{{NAME}},我想用变量替换它们。最有效的方法是什么?请记住,我的模板中有大约 10 个这样的占位符。

没有比str_replace更好的方法吗?

【问题讨论】:

  • 你总是可以创建你自己的函数来包裹str_replace 并且可能需要一个数组作为输入。这就是我会做的。
  • 您能解释一下str_replace()实际 问题吗?
  • 你想用变量替换还是用变量的内容替换?它有多丑 - 与什么相比?也许你应该分享一些代码,你现在是怎么做的......
  • @Felix Kling str_replace 实际上从 4.3.3 开始就可以将数组作为输入
  • 我想用变量的内容替换它。我现在正在做的是使用 file_get_contents 加载内容,并且我有一个以占位符作为键并将值设置为值的数组。例如,模板引擎如何做到这一点?同样的方式?

标签: php


【解决方案1】:

strtr

$trans = array(
    '{{NAME}}' => $name, 
    "{{AGE}}"   => $age,
    ......
);
echo strtr($text, $trans);

【讨论】:

  • 感谢您提供这个简单而优雅的解决方案。
【解决方案2】:

str_replace 不仅丑陋,而且如果您需要替换十个变量(进行二分搜索并从头开始为每个替代项),也会变得迟缓。

宁可使用preg_replace_callback,一次列出所有 10 个变量,或者使用后期查找:

$src = preg_replace_callback('/\{\{(\w+)}}/', 'replace_vars', $src);
                     # or (NAME|THING|FOO|BAR|FIVE|SIX|SVN|EGT|NNE|TEN)

function replace_vars($match) {
    list ($_, $name) = $match;
    if (isset($this->vars[$name])) return $this->vars[$name];
}

【讨论】:

  • Ehm... 使用正则表达式而不是精确搜索?似乎不是提高性能的好方法...
  • 好吧,在提高性能时,您应该查看实际的基准,而不是做出假设;) - PCRE 已高度优化以寻找替代方案。 str_replace 在内部使用循环。 “正则表达式总是较慢”是这里最被误导的模因。不用等了,第二。
  • 谢谢!这是一个很好的例子。当我不想使用 str_replace 时,我正在考虑性能。听说很慢我会试试你的解决方案。
【解决方案3】:

str_replace() 有什么难看的?

function replace_vars($string)
{
    $vars = array('NAME'=>'Name', 'VAR2'=>'Value 2', 'VAR3'=>'Value 3');

    $names = array();
    foreach($vars as $name=>$var) {
        $names[] = '{{'.$name.'}';
    }

    return str_replace($names, $vars, $string);
}

function replace_vars($string)
{
    $vars = array('{{NAME}}'=>'Name', '{{VAR2}}'=>'Value 2', '{{VAR3}}'=>'Value 3');

    return str_replace(array_keys($vars), $vars, $string);
}

【讨论】:

  • 试用:$vars = array('{{NAME}}'=>'{{VAR2}}', '{{VAR2}}'=>'Value 2');
  • 这不是我们使用{{...}} 格式的原因。为了防止它意外地成为某个地方的值?
  • 好吧,在代码示例中,您将再次替换替代品,从而使该原因变得毫无意义,您无法区分替换状态(A := 要替换; B := 已替换)。 {{...}} 是为状态 A 而不是 B 给出的。代码也将它们(部分)应用于状态 B,这可能被视为导致意外甚至错误行为的缺陷。我的评论是作为一种保障。它可能适用于所有情况的 99.9%,但其余情况呢?
猜你喜欢
  • 2020-06-03
  • 2012-05-11
  • 1970-01-01
  • 2020-10-16
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2017-09-11
相关资源
最近更新 更多