Php 在模板中使用循环
我开始写我自己的小规模框架,我已经得到了它的模板部分。到目前为止,我已经能够用以下代码进行简单的变量替换:Php 在模板中使用循环,php,templating,Php,Templating,我开始写我自己的小规模框架,我已经得到了它的模板部分。到目前为止,我已经能够用以下代码进行简单的变量替换: public function view($page, $vars) { if(!file_exists('system/views/' . $page . '.php')) { trigger_error("No Template found", E_USER_ERROR); } $tempArray = file_get_content
public function view($page, $vars)
{
if(!file_exists('system/views/' . $page . '.php'))
{
trigger_error("No Template found", E_USER_ERROR);
}
$tempArray = file_get_contents('system/views/' . $page . '.php');
foreach($vars as $key => $value)
{
$tempArray = str_replace('{' . $key . '}', $value, $tempArray);
}
print $tempArray;
unset($tempArray);
}
这很好,但我现在要寻找的是,如果我想循环显示数据库中未知数量的记录,我尝试了一些想法,但到目前为止似乎没有一个有效,因为Zed已经说过PHP有很多模板语言,最受欢迎的是,我不知道除了学习目的之外,重新发明轮子是否真的有意义。实际上,要执行的循环比替换元素要复杂得多。我很确定你可以用很多正则表达式来完成它,但在某个时候,你最终会编写自己的脚本语言(就像Smarty的家伙那样),解析你的视图文件,创建一个语法树,计算它并将它编译成一个新的PHP文件。这相当复杂,所以我建议要么使用现有的模板引擎,要么使用PHP作为模板语言本身(如果严格遵循可能有效的模式,尽管有很多关于该模式的讨论) 使用正则表达式,您可以解析{for…}{/for}之间的所有内容,以访问具有给定变量名的项,其中在{for and}之后出现变量定义,在}之后和{/for}之前出现html定义。这就像是一个foreach循环,你们甚至不能相互嵌套
{for item=$varname}
<p>{item.othervalue}</p>
{/for}
{for item=$varname}
{item.othervalue}
{/for}
首先,您应该重新考虑变量重写。有几种情况下,当您的方法之间存在一些依赖关系时,它们并没有按预期结束。此外,无论变量是否在循环中,所有内容都会被替换
如果您想要类似{while(condition)}code{/while}的东西,您需要知道递归也是可能的,因此它不像匹配正则表达式那样简单
一个简单的方法如下:
- 找到标记(变量whileloop)的开头并记住找到它的位置
- 如果它是一个变量,并且您在最外部的范围内(不在循环中),则通过替换来处理它。调整你的指针,这样你就不会在事后阅读替换内容,以避免替换你不想替换的内容
- 如果它是一个循环
- 提取支架之间的条件并将其存储在其他位置
- 另外,存储当前位置
- 将令牌推送到堆栈上以记住当前递归级别李>
- 当遇到{/while}标记时,从堆栈中移除标记
- 现在以递归方式进行,将所有嵌套循环标记推送到堆栈上,并在结束时移除它们。当您再次处于最外层时停止
- 评估循环的条件。只要是真的,就从源文本在开始标记和结束标记之间创建新副本,并使用递归处理它们
- 连接中间结果并用此连接替换从{while}到{/while}的所有内容。调整指针,使其指向循环后面,然后继续:)
@Daff:您可以找到带有正则表达式的标记,但由于递归的原因,使用一个正则表达式来匹配整个循环构造是行不通的(除非您的正则表达式有一个递归扩展)。如果您渴望了解这一点(就像我一样),您可以去-这是一个关于这一点的教程,但是你需要是plus会员才能阅读:)有很多开放源码的PHP模板语言,为什么你不看看其中的一种呢?我主要是为了学习,当然肯定有一些方法可以做到这一点,而不需要去像这样的Extereame?我添加了一个小例子。但如果你真的想学,你可能想走到一个极端。。。最简单的方法是使用PHP作为模板语言,或者创建自己的模板引擎。谢谢你的例子,这似乎是我一直在寻找的路线。回复我知道,但我想我会让你知道,这确实有很大帮助,谢谢!