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完了!!!!

  • 相关阅读:
    数学专业的数学与计算机专业的数学的比较(转)
    vim的复制粘贴小结(转)
    (转)会议期刊论文发表介绍(计算机科学领域)
    字符串最后一个单词的长度(华为在线训练)
    (转)初识suse——linux
    (转)C++中返回对象的情形及RVO
    mystring c++ 自己的string 封装
    std::string
    FTP 1.0
    conflicting types for xxxx错误 (转)
  • 原文地址:https://www.cnblogs.com/frankyang2014/p/2671501.html
Copyright © 2011-2022 走看看