【问题标题】:PHP - Extremely light templating systemPHP - 极轻的模板系统
【发布时间】:2010-10-31 22:12:30
【问题描述】:

有谁知道一个非常简单的php模板系统,就像str_replace("{variable}", $variable);一样简单?

我需要这个用于管理面板中的一系列文本区域,站点管理员应该在其中更改网站各种元素的模板(不是页面等复杂的东西,只是内容块)

【问题讨论】:

  • 如果你有任何只是streplace tempalte系统,写它,这是几行。
  • 是的,但它不是很优雅。至少有什么方法可以将多个变量映射到 {} 之间包装的字符串,以避免使用 1000 str_replace 的?
  • 是的,看我的answer

标签: php string templates variables


【解决方案1】:
/**
 * Renders a single line. Looks for {{ var }}
 *
 * @param string $string
 * @param array $parameters
 *
 * @return string
 */
function renderString($string, array $parameters)
{
    $replacer = function ($match) use ($parameters)
    {
        return isset($parameters[$match[1]]) ? $parameters[$match[1]] : $match[0];
    };

    return preg_replace_callback('/{{\s*(.+?)\s*}}/', $replacer, $string);
}

【讨论】:

  • 整洁。 :) 应该说它只是 php 5.3+。
  • 您需要运行 PHP 5.3 才能使用它。否则就不那么优雅了。
  • 尽量避免这种情况。正则表达式很耗费资源。
  • Design patterns revisited with PHP 5.3 中的 Fabien Potencier 相同(第 45 页)
  • @Alex 您需要为回调创建一个单独的函数(在您当前所在的范围之外)。
【解决方案2】:
$findReplaces = array(
    'first_name' => $user['first_name'],
    'greeting' => 'Good ' . (date('G') < 12 ) ? 'morning' : 'afternoon'
);

$finds = $replaces = array();

foreach($findReplaces as $find => $replace) {
    $finds[] = '{' . $find . '}';
    $replaces[] = $replace;
}

$content = str_replace($finds, $replaces, $content);

【讨论】:

  • 为什么不只包含花括号,例如{{first_name}} 在数组键中,只需执行 str_replace(array_keys($findReplaces),$findReplaces,$content)
  • @Gordon 是的,这要好得多。我能看到的唯一缺点是每个搜索词都需要包含分隔符 - 你知道,整个 DRY 的东西。
  • 是的,但话又说回来,每个使用带有花括号的模板引擎而不是仅仅使用 PHP 的人都应该得到这个:)
  • 呵呵,我会在下一个项目中使用它。不用等,我已经这样做了;)
猜你喜欢
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 2014-09-26
  • 2011-05-22
  • 1970-01-01
  • 2013-02-25
相关资源
最近更新 更多