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

  • 相关阅读:
    Flutter form 的表单 input
    FloatingActionButton 实现类似 闲鱼 App 底部导航凸起按钮
    Flutter 中的常见的按钮组件 以及自 定义按钮组件
    Drawer 侧边栏、以及侧边栏内 容布局
    AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换 通过TabController 定义TabBar
    清空路由 路由替换 返回到根路由
    应对ubuntu linux图形界面卡住的方法
    [转] 一块赚零花钱
    [转]在树莓派上搭建LAMP服务
    ssh保持连接
  • 原文地址:https://www.cnblogs.com/frankyang2014/p/2671501.html
Copyright © 2011-2022 走看看