热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正则应用实例-简单模仿smarty

smarty的功能非常强大,不是下面几行代码可以实现的,但是我们可以取出其中的一部分,通过正则实现,比如简单的assign,display,编译缓存

smarty的功能非常强大,不是下面几行代码可以实现的,但是我们可以取出其中的一部分,通过正则实现,比如简单的assign,display,编译缓存,内容缓存等,我们这里只是一个Demo,基本实现了assign和display,以及编译文件的缓存。其实内容的缓存也非常简单,就是文件的写入操作,包括缓存周期,物理文件路径等。这些都可以通过文件操作实现,但由于篇幅所限,所以这里不再赘述。

平板视图
打印?
1 // index.php文件是个入口文件,代码如下
2 require_once('my_smarty.php');
3 $demo=newMyTpl();
4 $demo->assign('title','smarty demo');
5 $demo->assign('content','hello iphper');
6 $demo->display('index.html');
平板视图
打印?
01 // my_smarty.php代码如下 这是一个类
02 classMyTpl {
03 private$template_dir;
04 private$compile_dir;
05 private$tpl_vars=array();
06   
07 publicfunction__construct($template_dir='./template',$compile_dir='./compile') {
08   
09 // 默认模板目录和编译之后的文件目录都在当前文件下面
10 $this->template_dir = rtrim($template_dir,'/').'/';
11 $this->compile_dir = rtrim($compile_dir,'/').'/';
12 }
13 publicfunctionassign($tpl_var,$value=null) {
14 if($tpl_var!='') {
15 $this->tpl_vars[$tpl_var] =$value;
16 }
17 }
18 publicfunctiondisplay($file_name) {
19 $tpl_file=$this->template_dir.$file_name;
20 if(!file_exists($tpl_file)) {
21 returnfalse;
22 }
23   
24 // 编译文件的命名规则
25 $compile_file_name=$this->compile_dir.'com_'.$file_name.'.php';
26   
27 // 当编译文件不存在或者修改之后重新编译文件
28 if(!file_exists($compile_file_name) ||filemtime($tpl_file) >filemtime($compile_file_name)){
29 $compile_file_cOntent=$this->tpl_replace(file_get_contents($tpl_file));
30 file_put_contents($compile_file_name,$compile_file_content);
31 }
32 include($compile_file_name);
33 }
34   
35 privatefunctiontpl_replace($content) {
36   
37 // 正则的运用 匹配替换
38   
39 $pattern=array('/\{\s*\$([a-zA-Z_]\w*)\s*\}/i');
40   
41 $replace=array('tpl_vars["${1}"];?>');
42   
43 // 注意如何反引用 ${1} 等价 \\1
44   
45 $replaced= preg_replace($pattern,$replace,$content);
46   
47 return$replaced;
48 }
49 }
平板视图
打印?
1 // 模板文件 位于template目录下
2
3
4
5
6 {$content}
good
7
平板视图
打印?
1 // 模板编译后的文件 位于compile目录下
2
3
4
5
6 tpl_vars["content"];?>
good
7

上述实例涉及到php面向对象的一些知识点,所以不太适合初学者。但是目前个人时间原因就给了这个例子,其他控制用户输入的正则很多,网上比比皆是,所以就略去了。但是并不代表我们会了,所以有时间要多看看别人怎么写,自己多应用应用,孰能生巧。正则强大的功能有待我们继续探讨,以后我将继续给出相关综合实例。



推荐阅读
  • 在学习了Splay树的基本查找功能后,可能会觉得它与普通的二叉查找树没有太大的区别,仅仅是通过splay操作减少了时间开销。然而,Splay树之所以被誉为“序列之王”,主要在于其强大的区间操作能力。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 本文介绍了如何通过安装和配置php_uploadprogress扩展来实现文件上传时的进度条显示功能。通过一个简单的示例,详细解释了从安装扩展到编写具体代码的全过程。 ... [详细]
  • HTML 表格与列表标签详解
    本文详细介绍了HTML中的表格标签和列表标签的使用方法,包括如何创建表格的不同部分(如标题、头部、主体和脚部),以及如何利用这些标签进行数据展示和布局设计。 ... [详细]
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • 本文探讨了当通过Nginx访问网站时出现504 Gateway Timeout错误的解决方案,特别是当请求处理时间超过30秒时的情况。文章提供了调整PHP-FPM配置的具体步骤,以延长请求超时时间。 ... [详细]
  • 本文总结了 #define 在 C/C++ 编程中的多种用途和技巧,包括定义常量、函数、宏以及条件编译等,并提供了详细的示例和注意事项。 ... [详细]
  • 本文介绍了一个来自AIZU ONLINE JUDGE平台的问题,即清洁机器人2.0。该问题来源于某次编程竞赛,涉及复杂的算法逻辑与实现技巧。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
author-avatar
mqfcu123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有