[自制模板引擎] 为模板引擎增加解析表达式功能

通过上一片已经能把占位符替换成对应的变量的值,实现了一个简单的迷你模板引擎,模板引擎一个不错的功能就是能够计算一些简单的表达式,计算表达式的核心其实就是执行字符串,执行字符串的方法多种多样eval,Function,setTimeout等等,都能执行,至于用哪种方法,就仁者见仁智者见智了。

下面整理一下在模板引擎中会遇到的表达式:

{ a + b }     //普通的计算表达式
{ a == false }   //普通的比较
{ a === false }  //全等比较
{ a !== false}
{ !a }  //非运算
……

普通表达式,非运算,比较

这三种表达式,无非就是替换其中的变量,然后判断一下是否为数字,最后执行一遍这个字符串便能直接解析出这段表达式,所以下面解析出这几种运算符。

//替换一个表达式内的运算符
var m = "  1 + 2 + 3 - 1 + test";
var obj = {
      test : 1
}//处理运算符的值//这里简单的处理了加减操作
m = m.replace(/[^\+-\s]*/g,function(varMatch) {
    //如果是不是数字
    //并且在对应的对象有这个属性
    if (Number(varMatch) != Number(varMatch) && obj[varMatch]) {
        if (typeof obj[varMatch] === "number") {
            return obj[varMatch];
        }else{
            return "‘" + obj[varMatch] + "‘";
        }
    }else{
        return varMatch;
    }
});
console.log(m);

不管用什么方法,解析表达式必须要执行字符串表达式,所以方法千万种,目的只有一个,下面是一个完整的可执行的解析表达式的例子。

var originalData = {
    jquery : "hello jquery",
    angular : " two-way data binding",
    react : "The Fast and the Furious"
}
var text = "我喜欢{{jquery + angular}},但是最近几年{{angular == angular}}貌似是一个方向,但是又有了{{react == false}},让我犹豫了我是否应该报考蓝翔学习{{1+1}}"
activeExpresstion(text,originalData);
function activeExpresstion(text,obj){
    var operatorReg = /[\+-\/\*\=\!]*/g;
    var variableReg = /[^\+-\/\*=\!\s]+/g;
    var placeReg = /\{\{.*?\}\}/g;
    var expressValue;  //取出每一组{{}}包含的占位符
    text = text.replace(placeReg,function(m){
        m = m.substring(2,m.length-2);
        //判断是否有运算符
        if (operatorReg.test(m)) {
            m = m.replace(variableReg,function(varMatch) {
                //如果是不是数字
                //并且在对应的对象有这个属性
                if (Number(varMatch) != Number(varMatch) && obj[varMatch]) {
                    if (typeof obj[varMatch] === "number") {
                        return obj[varMatch];
                    }else{
                        return "‘" + obj[varMatch] + "‘";
                    }

                }else{
                    return varMatch;
                }
            })
            eval("expressValue = " + m);
            return expressValue;
        }else {
            if (obj[m]){
                return obj[m]
            }else{
                return m;
            }
        }
    });
    return text;
}
时间: 2024-10-27 09:00:21

[自制模板引擎] 为模板引擎增加解析表达式功能的相关文章

模板输出的数组中增加三元运算符来判断

得出一个好用的判断方法,在模板输出的数组中增加三元运算符来判断,挺方便的.当然你也可以用Ajax~ <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题</title> </head> <body> 我的口号是什么?——><{$data[

(转)DEDECMS模板原理、模板标签学习 - .Little Hann

本文,小瀚想和大家一起来学习一下DEDECMS中目前所使用的模板技术的原理: 什么是编译式模板.解释式模板,它们的区别是什么? 模板标签有哪些种类,它们的区别是什么,都应用在哪些场景? 学习模板的机制原理对我们修复目前CMS中常出现的模板类代码执行的漏洞能起到怎样的帮助? 带着这些问题,我们进入今天的代码研究,just hacking for fun!! 文章主要分为以下几个部分 1. 模板基本知识介绍 2. 怎么使用模板机制.模板标签的使用方法 3. DEDE模板原理学习 1) 编译式模板 2

Django框架(八)—— 模板层:模板导入、模板继承、静态文件

模板导入.继承.静态文件 一.模板导入 要复用一个组件,可以将该组件写在一个文件中,在使用的时候导入即可 在模板中使用 1.语法 {% include '模板名字' %} 2.使用 ad.html页面 <div class="adv"> <div class="panel panel-default"> <div class="panel-heading"> <h3 class="panel-t

tp5 模板参数配置(模板静态文件路径)

// 模板页面使用 <link rel="stylesheet" type="text/css" href="{:config('__STATICADMIN__')}/h-ui.admin/css/style.css" /> '__STATICCSS__' =>'/static/Css', 'template' => [ // 模板引擎类型 支持 php think 支持扩展 'type' => 'Think', /

浏览器内核、排版引擎、js引擎

[定义] 浏览器最重要或者说核心的部分是“Rendering Engine”,可大概译为“渲染引擎”,不过我们一般习惯将之称为“浏览器内核”.负责对网页语法的解释(如标准通用标记语 言下的一个应用HTML.JavaScript)并渲染(显示)网页. 所以,通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页的内容以及 页面的格式信息.不同的浏览器内核对网页编写语法的解释也有不同,因此同一网页在不同的内核的浏览器里的渲染(显示)效果也可能不同,这也是网页编写者需要在不

Django中模板总结[模板语言,模板继承,CSRF攻击,反向解析]

模板 概述 作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再通过在视图中渲染模板,将生成最终的html字符串返回给客户端浏览器.模版致力于表达外观,而不是程序逻辑.模板的设计实现了业务逻辑view与显示内容template的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用. 创建模板文件夹 在项目的文件里面定义一个templates文件夹 在创建的文件夹里面再创建一个文件夹为每个应用的html文件夹 起名为和应用名同名的文

VS自定义项目模板:[6]模板参数

VS2013(VS2010等版本也适用,均需安装Visual Studio SDK) 认识模板参数 模板参数以 $parameter$ 格式进行声明. 模板参数能用于源代码文件,模板项目文件,模板文件等.   启用模板参数替换功能. 在模板文件(*.vstemplate)中,如需将模板参数替换成对应的值,需将ReplaceParameters 特性设置为 true. 如下:模板原文件Class1.cs中,下面语句实现目标.NET版本大于等于3.5的话,增加命名空间System.Linq的引用.在

浏览器内核、渲染引擎、js引擎

[1]定义 浏览器内核分成两部分渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具 [2]常见引擎 渲染引擎: firefox使用gecko引擎 IE使用Trident引擎 2015年微软推出自己新的浏览器,原名叫斯巴达,后改名edge,使用edge引擎 opera最早使用Presto引擎,后来弃用 chrome\safari\opera使用webkit引擎 13年chrome和opera开始使用Blink引擎 js

Cacti 模板(图形模板、数据模板、主机模板)与自定义监控脚本

Cacti定义了三种类型的模板,分别是 主机模板 数据模板 图形模板     主机模板(Host templates),它是图像模板和数据查询的一个集合,描述了监控某一类型的机器需要生成那些图像. 数据模板(Data templates),它描述了 Cacti 存储哪些数据到指定类型的 RRD 文件.该模板与 RRDTool 工具的 create 命令相关. 图形模板(Graph templates),描述了生成的一张图像应该是什么样子的.包括使用哪些数据模板.展示哪些元素.是否使用 CDEF