我没有仔细看smrty内部到底是怎么写的只是用了之后根据自己的想法,感觉是这样的,写点东西。当然只是针对foreach这一个函数,如果有错误希望您能提出来,因为这会给我莫大的帮助!!
关于 smarty内部是如何解析这些代码的一直都是我的困惑,我想以这个为例:
- <{ foreach from = $arr1 item = temp }>
- <{ $temp }>
- <{/foreach }>
“<{ }>"是自己定义的分隔符号。(假使$arr1是一个简单的一位数组. ) 这些都是模版文件tpl中的内容,这个foreach只是其中的一小段内容,我现在只分析foreach,因为其他内容我还没想太明白……觉得前人真是思 维很缜密,会想到将foreach中的两个值用from和item来标记…………
一、首先,提取文件流中所有标记符之间的数据,并存入一个数组:$arr中
2.循环遍历数组,并比对每一个字符串中是否包含foreach关键字或者其他关键字。比如:
$arr[0]=" foreach from = $arr1 item = temp "
$arr[1]=" $temp "
$arr[2]="/foreach"
首先判断arr[0],包含foreach,则将$arr[0]中“from = ”后面但是“item”前的内容“$arr1”提取出来,存入数组str【0】,再将"item = "后的内容提取出来,存入str[1],然后将这些数组拼合成一个新的数组str,
则str="<?php foreach("+str[0]+"as $"+str[1]+"){ ?>",将该串替换$arr[0]所在字符流中的位置,即
原内容变成:<?php foreach($arr1 as $temp){ ?>
二、继续遍历arr[1],
由于只有变量标识符$,我想即使是$temp变成比较语句、赋值语句,也应该直接输出,因为这些都将写入文件中,不需要得出结果,所以替换成:<?php echo "$temp"; ?>
前两句合起来就是:
- <?php foreach($arr1 as $temp){ ?>
- <?php echo "$temp"; ?>
三、继续遍历arr【2】
由于遇到了/foreach符号,所以输出:“}”符号,可是 当我们使用if elseif 以及else的时候,在碰到/if时应该输出几个“}”呢?我想在碰到elseif及else时要提前输出“}”来确保上一个符号被关闭。则,替换完成后,成为这样子:
- <?php foreach($arr1 as $temp){ ?>
- <?php echo "$temp"; ?>
- <?php } ?>
(去掉碍眼的php标记,就是:
- foreach($arr1 as $temp){
- echo "$temp";
- }
这样就很清晰了。)
这样再将替换完成的流输出至文件…….php,并调用该文件。ok完了!!!!