zoukankan      html  css  js  c++  java
  • 模版引擎 smarty 怎样工作的 学习感悟 foreach

    我没有仔细看smrty内部到底是怎么写的只是用了之后根据自己的想法,感觉是这样的,写点东西。当然只是针对foreach这一个函数,如果有错误希望您能提出来因为这会给我莫大的帮助!!

    关于 smarty内部是如何解析这些代码的一直都是我的困惑,我想以这个为例:

    1. <{ foreach from = $arr1 item = temp }>
    2. <{ $temp }>
    3. <{/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"; ?>

    前两句合起来就是:

    1. <?php foreach($arr1 as $temp){  ?>
    2. <?php echo "$temp"; ?>

    三、继续遍历arr【2】

    由于遇到了/foreach符号,所以输出:“}”符号,可是 当我们使用if elseif 以及else的时候,在碰到/if时应该输出几个“}”呢?我想在碰到elseif及else时要提前输出“}”来确保上一个符号被关闭。则,替换完成后,成为这样子:

    1. <?php foreach($arr1 as $temp){  ?>
    2. <?php echo "$temp"; ?>
    3. <?php } ?>

    (去掉碍眼的php标记,就是:

    1. foreach($arr1 as $temp){
    2. echo "$temp";

    这样就很清晰了。)

    这样再将替换完成的流输出至文件…….php,并调用该文件。ok完了!!!!

  • 相关阅读:
    Dev XtraTreeList 学习
    DataGridView单元格显示GIF图片
    如何在.NET上处理二维码
    设计模式之UML类图的常见关系(一)
    .NET常用操作小知识
    Sql Server 存储过程使用技巧
    WinForm中如何判断关闭事件来源于用户点击右上角的“关闭”按钮
    WinFrom 安装包制作
    DBHelper数据库操作类(二)
    spring cloud zipkin
  • 原文地址:https://www.cnblogs.com/frankyang2014/p/2671501.html
Copyright © 2011-2022 走看看