模板引擎开发(二)-值标签的处理
前面发了一篇,看到一些朋友评论,我说明一下。
我这个模板引擎不是为了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;
}
最后把处理后的实际值把标签替换掉就可以了。
在值标签的处理过程中,主要是正则表达式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库