惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
美团技术团队
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
L
LangChain Blog
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
腾讯CDC
Recent Announcements
Recent Announcements
The Register - Security
The Register - Security
有赞技术团队
有赞技术团队
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky
博客园 - 司徒正美
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
C
Check Point Blog
小众软件
小众软件
V
Visual Studio Blog
V
V2EX
F
Full Disclosure
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
罗磊的独立博客
人人都是产品经理
人人都是产品经理
量子位
Apple Machine Learning Research
Apple Machine Learning Research
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
博客园_首页
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
Recorded Future
Recorded Future
G
Google Developers Blog
Vercel News
Vercel News
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
U
Unit 42
爱范儿
爱范儿
Jina AI
Jina AI

博客园 - songsoft

Js表单验证控件-02 Ajax验证 Js表单验证控件(使用方便,无需编码)-01使用说明 字符串对比 KindEditor编辑器For DotNet控件 模板引擎开发(三)-自定义标签的处理 Flash AS实现时钟效果(全脚本实现) Jquery插件-浮动广告 模板引擎开发(一) 软件开发模型之一 万祖归宗是瀑布 关于制度化管理 关于加薪的策略 关于文档编写 蓝海与红海--有感于软件创新 李广难封--有感于团队建设 哪里是乐土?--关于团队良性循环 从酒桌上看团队建设 创造一切条件让大家“混” 百万富翁成长路线 绿有四季--关于需求沟通
模板引擎开发(二)-值标签的处理
songsoft · 2013-06-09 · via 博客园 - songsoft

前面发了一篇,看到一些朋友评论,我说明一下。

我这个模板引擎不是为了MVC使用的,而是纯粹是为了供网页制作人员使用,通过一些简单的标签,能将网站后台填写的内容在前台展示出来,生成静态化的网页,类似于织梦CMS的思路。

我之前也研究了一下NVelocity,它的确比我写的强大,我当初研究它只是研究它是以什么算法处理文档的,为什么这么快,不过没有研究出个明堂,呵呵。我这个处理引擎现在的执行速度只能算一般般,全站静态化生成的单线程处理需要二十几秒。当然也有数据库的原因,我测试时使用的是Access数据库。后续还要重构和优化代码,想办法提升执行速度。

本文主要描述值标签的处理。

值标签分为“全局值标签”与“局部值标签”两类,全局值标签顾名思义就是在整网站模板中,都起作用;局部值标签只在特定的页面起作用。这两类的标签样式都是一样的。

例如:

{%=orgSiteName%}企业网站的名称,这是一个全局值标签

{%=pdname%}当前产品的名称,这是一个局部值标签

值标签可以带格式化,例如:

{%=pdPushTime:yyyy年M月d日%}当前产品的发布时间,输出格式为年月日

值标签的处理很简单,首先是检索{%=%}字符。我用了正则表达式

string patt = @"{%=\s*(\S[^\s%]+)\s*%}";

Regex rex = new Regex(patt, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline);

MatchCollection mc = rex.Matches(context);

上述代码可以看出,值标签书写时允许带有空格、大小写不敏感。

变量mc即匹配出的对象。我们接着循环处理mc即可。如下:

            for (int i = 0; i < mc.Count; i++)

            {

                Match ma = mc[i];

      //值标签{%=tag%}中的tag

                string key = ma.Groups[1].Value.Trim();

                //是否有格式符

                bool isFormat = key.IndexOf(":") > -1;

                string format = isFormat ? key.Substring(key.IndexOf(":") + 1) : "";

                key = isFormat ? key.Substring(0, key.IndexOf(":")) : key;  

      if (!isFormat)……//如果没有格式符

      if (isFormat) ……//如果有格式符          

            }

上述代码中,我们取到了值标签中的具体标签与其格式符,当然格式符可以为空(如{%=orgsitename%} 没有格式符)。

取到这两个值后,可以格式化了

   /// <summary>
        /// 将变量格式化,格式化遵循C#格式规则
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private static string _format(object obj,string format)
        {
            string val = "";
            if (obj is DateTime) val = ((DateTime)obj).ToString(format);
            if (obj is int) val = ((int)obj).ToString(format);
            if (obj is long) val = ((long)obj).ToString(format);
            return val;
        }

 最后把处理后的实际值把标签替换掉就可以了。

 在值标签的处理过程中,主要是正则表达式。