使用str_replace进行PHP模板化?

时间:2009-01-25 08:43:17

标签: php templates

我认为PHP模板系统的基本原理是字符串替换,对吧? 所以我可以使用一个字符串来保存我的html模板代码,如

$str_template = "<html><head><title>{the_title}</title><body>{the_content}</body></html>"

并在下面的代码中只需执行str_replace将数据推送到我的模板变量中,如

str_replace( $str_template, '{the_title}', $some_runtime_generated_title );
str_replace( $str_template, '{the_content}', $some_runtime_generated_content );

然后最后

echo $str_template; 

这有望使整个变量传递过程更快吗?我知道这可能是一个奇怪的问题,但有人试过吗?

9 个答案:

答案 0 :(得分:6)

是的,这是模板系统背后的基本思想。您可以进一步抽象它,让其他方法添加括号,例如。

你也可以使用带有str_replace的数组,因此可以用这样的一个函数调用做更多的替换

str_replace(array('{the_title}', '{the_content}'), array($title, $content), $str_template);

我使用的系统是Spoon Library,他们的模板系统非常坚固,包括编译模板,这是一个巨大的性能提升。

答案 1 :(得分:4)

这通常是模板系统的基本思想。真正的模板系统具有更多功能,但核心是他们所做的。

你问这是否会“使整个变量传递过程更快”。比什么更快?你现在正在做的事情会遇到性能问题吗?

答案 2 :(得分:2)

使用模板引擎是一个好主意。

但是当html较大时你的想法变慢,如果你需要更多的变量,你的想法会变慢。记住,每次请求都会执行替换。

你可以使用包含php标签的html文件进行输出(如<?=$var?>)和循环。 通过“include”将它们包含在您的PHP代码中。 那要快得多。

看看smarty。这是我最喜欢的php模板引擎。 smarty有很多很好的功能,比如缓存,它可以通过插件扩展。

如果您了解德语,请查看here。对smarty有一个小小的介绍。

答案 3 :(得分:2)

我会构建一个解析器,将代码分解为令牌(变量和纯文本)。作为一种简单的方法,您可以使用pre_split函数执行此操作:

$tokens = preg_split('/(\{[^\}]+\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);

现在您可以迭代令牌并检查它是变量还是纯文本:

foreach ($tokens as $token) {
    if ($token[0] === '{' && $token[strlen($token)-1] === '}') {
        // token is a variable
    } else {
        // token is plain text
    }
}

这种方法的优点是变量不会在已经被替换的文本中被替换。所以:

$foo = '{bar}';
$bar = 'bar';
$template = 'Lorem {foo} {bar} sit amet …';

此处的文字将被Lorem bar {bar} sit amet …替换为Lorem bar bar sit amet …,因为在{bar}之后替换{foo}时,您的代码会发生这种情况。

答案 4 :(得分:1)

当然,你需要以正确的顺序拥有参数。 str_replace()

将模板放在自己的文件中而不是将它们保存在字符串中也可能是个好主意。然后只需通过file_get_contents()或类似内容阅读它们。

答案 5 :(得分:1)

如果只进行变量扩展,则可以执行以下操作:

$str_template = "<html><head><title>$the_title</title><body>$the_content</body></html>";

它也会起作用...
当PHP已经是模板系统时,有些人想知道为什么有模板系统......

当然,这些系统还有其他优点,例如更安全地访问变量,设计人员可能更容易处理(或通过工具生成),视图层中的逻辑限制......这是一种常见的批评像Smarty这样的重型模板系统,有如此多的逻辑,你几乎可以用它编写另一个模板系统! ; - )

某些模板系统(如Savant)采取了中间道路。 : - )

答案 6 :(得分:1)

你根本无法以这种方式制作模板 真实生活模板不仅需要填充普通变量,还需要几个控制结构,或者至少需要某种块来控制页面的某些区域(例如,制作循环)。
因此,您无法仅使用str_replace创建模板。还需要一些正则表达式和复杂的解析。

因此,最好坚持使用已经可以使用的模板引擎 - PHP本身!

答案 7 :(得分:0)

基本上这个想法是一个,但模板是提供更多的东西,例如RainTPL是WYSIWYG,因为它用服务器路径替换模板的相对路径,这样你在本地设计你的模板,它的工作原理在服务器上无需更改img / css。

答案 8 :(得分:0)

实际上,“你的常识”的答案是正确的。您可以使用PHP来使用当前上下文并替换变量。您可以执行ob_start()将其保存在缓冲区中并获取替换的内容,而不是编写输出。简单而优雅!