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

PHP模板解析类实例【PHP】

后端开发|php教程PHP,模板,解析类后端开发-php教程本文实例讲述了PHP模板解析类。分享给大家供大家参考。具体如下:新闻系统源码,杀毒软件ubuntu,爬虫个人网银,php

后端开发|php教程PHP模板解析类实例【PHP】
PHP,模板,解析类
后端开发-php教程
本文实例讲述了PHP模板解析类。分享给大家供大家参考。具体如下:
新闻 系统 源码,杀毒软件 ubuntu,爬虫个人网银,php postapi,酒泉优化seolzw

cOnf= &$conf; $this->template_c = $this->conf['template_config']['template_c'];//编译目录 $this->_tpl_suffix = $this->tpl_suffix(); } private function str_replace($search, $replace, $content) { if(empty($search) || empty($replace) || empty($content)) return false; return str_replace($search, $replace, $content); } /** * preg_match_all * @param $pattern 正则 * @param $content 内容 * @return array */ private function preg_match_all($pattern, $content) { if(empty($pattern) || empty($content)) core::show_error('查找模板标签失败!'); preg_match_all("/".$this->template_tag_left.$pattern.$this->template_tag_right."/is", $content, $match); return $match; } /** * 模板文件后缀 */ public function tpl_suffix() { $tpl_suffix = empty($this->conf['template_config']['template_suffix']) ? $this->tpl_suffix : $this->conf['template_config']['template_suffix'] ; return $tpl_suffix; } /** * 此处不解释了 * @return */ public function assign($key, $value) { $this->vars[$key] = $value; } /** * 渲染页面 * @param * 使用方法 1 * $this->view->display('error', 'comm/'); * 默认是指向TPL模版的跟目录,所以comm/就是 tpl/comm/error.html * 使用方法 2 * $this->view->display('errorfile'); * 默认指向控制器固定的文件夹 * 例如你的域名是 http://heartphp/admin/index, 那么正确路径就是tpl/admin/index/errorfile.html * @return */ public function display($filename = '', $view_path = '') { $tpl_path_arr = $this->get_tpl($filename, $view_path);//获取TPL完整路径 并且向指针传送路径以及名称 if(!$tpl_path_arr) core::show_error($filename.$this->_tpl_suffix.'模板不存在'); //编译开始 $this->view_path_param = $view_path;//用户传递过来的模版跟目录 $this->compile(); } /** * 编译控制器 * @param * @return */ private function compile() { $filepath = $this->template_path.$this->template_name; $compile_dirpath = $this->check_temp_compile(); $vars_template_c_name = str_replace($this->_tpl_suffix, '', $this->template_name); $include_file = $this->template_replace($this->read_file($filepath), $compile_dirpath, $vars_template_c_name);//解析 if($include_file) { $this->read_config() && $cOnfig= $this->read_config(); extract($this->vars, EXTR_SKIP); [url=home.php?mod=space&uid=48608]@include[/url] $include_file; } } /** * 读取当前项目配置文件 */ protected function read_config() { if(file_exists(SYSTEM_PATH.'conf/config.php')) { @include SYSTEM_PATH.'conf/config.php'; return $config; } return false; } /** * 解析模板语法 * @param $str 内容 * @param $compile_dirpath 模版编译目录 * @param $vars_template_c_name 模版编译文件名 * @return 编译过的PHP模板文件名 */ private function template_replace($str, $compile_dirpath, $vars_template_c_name) { if(empty($str)) core::show_error('模板内容为空!'); //处理编译头部 $compile_path = $compile_dirpath.$vars_template_c_name.$this->tpl_compile_suffix;//编译文件 if(is_file($compile_path)) { //$header_cOntent= $this->get_compile_header($compile_path); //$compile_date = $this->get_compile_header_comment($header_content); $tpl_filemtime = filemtime($this->template_path.$this->template_name); $compile_filemtime = filemtime($compile_path); //echo $tpl_filemtime.'=='.date('Y-m-d H:i:s', $tpl_filemtime).'
'; //echo $compile_filemtime.'=='.date('Y-m-d H:i:s', $compile_filemtime); //如果文件过期编译 当模板标签有include并且有修改时 也重新编译 // 当修改include里的文件,非DEBUG模式时 如果不更改主文件 目前是不重新编译include里的文件,我在考虑是否也要更改,没想好,暂时这样,所以在开发阶段一定要开启DEBUG=1模式 要不然修改include文件无效 。 有点罗嗦,不知道表述清楚没 if($tpl_filemtime > $compile_filemtime || DEBUG) { $ret_file = $this->compile_file($vars_template_c_name, $str, $compile_dirpath); } else { $ret_file = $compile_path; } } else {//编译文件不存在 创建他 $ret_file = $this->compile_file($vars_template_c_name, $str, $compile_dirpath); } return $ret_file; } /** * 模板文件主体 * @param string $str 内容 * @return html */ private function body_content($str) { //解析 $str = $this->parse($str); $header_comment = "Create On##".time()."|Compiled from##".$this->template_path.$this->template_name; $cOntent= "\r\n$str"; return $content; } /** * 开始解析相关模板标签 * @param $content 模板内容 */ private function parse($content) { //foreach $cOntent= $this->parse_foreach($content); //include $cOntent= $this->parse_include($content); //if $cOntent= $this->parse_if($content); //elseif $cOntent= $this->parse_elseif($content); //模板标签公用部分 $cOntent= $this->parse_comm($content); //转为PHP代码 $cOntent= $this->parse_php($content); return $content; } /** * echo 如果默认直接 转成 */ private function parse_echo($content) { } /** * 转换为PHP * @param $content html 模板内容 * @return html 替换好的HTML */ private function parse_php($content){ if(empty($content)) return false; $cOntent= preg_replace("/".$this->template_tag_left."(.+?)".$this->template_tag_right."/is", "", $content); return $content; } /** * if判断语句 * * zhang * * liang * * zhangliang * */ private function parse_if($content) { if(empty($content)) return false; //preg_match_all("/".$this->template_tag_left."if\s+(.*?)".$this->template_tag_right."/is", $content, $match); $match = $this->preg_match_all("if\s+(.*?)", $content); if(!isset($match[1]) || !is_array($match[1])) return $content; foreach($match[1] as $k => $v) { //$s = preg_split("/\s+/is", $v); //$s = array_filter($s); $cOntent= str_replace($match[0][$k], "", $content); } return $content; } private function parse_elseif($content) { if(empty($content)) return false; //preg_match_all("/".$this->template_tag_left."elseif\s+(.*?)".$this->template_tag_right."/is", $content, $match); $match = $this->preg_match_all("elseif\s+(.*?)", $content); if(!isset($match[1]) || !is_array($match[1])) return $content; foreach($match[1] as $k => $v) { //$s = preg_split("/\s+/is", $v); //$s = array_filter($s); $cOntent= str_replace($match[0][$k], "", $content); } return $content; } /** * 解析 include include标签不是实时更新的 当主体文件更新的时候 才更新标签内容,所以想include生效 请修改一下主体文件 * 记录一下 有时间开发一个当DEBUG模式的时候 每次执行删除模版编译文件 * 使用方法 * @param $content 模板内容 * @return html */ private function parse_include($content) { if(empty($content)) return false; //preg_match_all("/".$this->template_tag_left."include\s+(.*?)".$this->template_tag_right."/is", $content, $match); $match = $this->preg_match_all("include\s+(.*?)", $content); if(!isset($match[1]) || !is_array($match[1])) return $content; foreach($match[1] as $match_key => $match_value) { $a = preg_split("/\s+/is", $match_value); $new_tag = array(); //分析元素 foreach($a as $t) { $b = explode('=', $t); if(in_array($b[0], $this->tag_include)) { if(!empty($b[1])) { $new_tag[$b[0]] = str_replace("\"", "", $b[1]); } else { core::show_error('模板路径不存在!'); } } } extract($new_tag); //查询模板文件 foreach($this->conf['view_path'] as $v){ $conf_view_tpl = $v.$file;//include 模板文件 if(is_file($conf_view_tpl)) { $c = $this->read_file($conf_view_tpl); $inc_file = str_replace($this->_tpl_suffix, '', basename($file)); $this->view_path_param = dirname($file).'/'; $compile_dirpath = $this->check_temp_compile(); $include_file = $this->template_replace($c, $compile_dirpath, $inc_file);//解析 break; } else { core::show_error('模板文件不存在,请仔细检查 文件:'. $conf_view_tpl); } } $cOntent= str_replace($match[0][$match_key], '', $content); } return $content; } /** * 解析 foreach * 使用方法 * @param $content 模板内容 * @return html 解析后的内容 */ private function parse_foreach($content) { if(empty($content)) return false; //preg_match_all("/".$this->template_tag_left."foreach\s+(.*?)".$this->template_tag_right."/is", $content, $match); $match = $this->preg_match_all("foreach\s+(.*?)", $content); if(!isset($match[1]) || !is_array($match[1])) return $content; foreach($match[1] as $match_key => $value) { $split = preg_split("/\s+/is", $value); $split = array_filter($split); $new_tag = array(); foreach($split as $v) { $a = explode("=", $v); if(in_array($a[0], $this->tag_foreach)) {//此处过滤标签 不存在过滤 $new_tag[$a[0]] = $a[1]; } } $key = ''; extract($new_tag); $key = ($key) ? '$'.$key.' =>' : '' ; $s = ''; $cOntent= $this->str_replace($match[0][$match_key], $s, $content); } return $content; } /** * 匹配结束 字符串 */ private function parse_comm($content) { $search = array( "/".$this->template_tag_left."\/foreach".$this->template_tag_right."/is", "/".$this->template_tag_left."\/if".$this->template_tag_right."/is", "/".$this->template_tag_left."else".$this->template_tag_right."/is", ); $replace = array( "", "", "" ); $cOntent= preg_replace($search, $replace, $content); return $content; } /** * 检查编译目录 如果没有创建 则递归创建目录 * @param string $path 文件完整路径 * @return 模板内容 */ private function check_temp_compile() { //$paht = $this->template_c. $tpl_path = ($this->view_path_param) ? $this->view_path_param : $this->get_tpl_path() ; $all_tpl_apth = $this->template_c.$tpl_path; if(!is_dir($all_tpl_apth)) { $this->create_dir($tpl_path); } return $all_tpl_apth; } /** * 读文件 * @param string $path 文件完整路径 * @return 模板内容 */ private function read_file($path) { //$this->check_file_limits($path, 'r'); if(($r = @fopen($path, 'r')) === false) { core::show_error('模版文件没有读取或执行权限,请检查!'); } $cOntent= fread($r, filesize($path)); fclose($r); return $content; } /** * 写文件 * @param string $filename 文件名 * @param string $content 模板内容 * @return 文件名 */ private function compile_file($filename, $content, $dir) { if(empty($filename)) core::show_error("{$filename} Creation failed"); $cOntent= $this->body_content($content);//对文件内容操作 //echo '开始编译了====='; $f = $dir.$filename.$this->tpl_compile_suffix; //$this->check_file_limits($f, 'w'); if(($fp = @fopen($f, 'wb')) === false) { core::show_error($f.'
编译文件失败,请检查文件权限.'); } //开启flock flock($fp, LOCK_EX + LOCK_NB); fwrite($fp, $content, strlen($content)); flock($fp, LOCK_UN + LOCK_NB); fclose($fp); return $f; } /** * 这个检查文件权限函数 暂时废弃了 * @param [$path] [路径] * @param [status] [w=write, r=read] */ public function check_file_limits($path , $status = 'rw') { clearstatcache(); if(!is_writable($path) && $status == 'w') { core::show_error("{$path}
没有写入权限,请检查."); } elseif(!is_readable($path) && $status == 'r') { core::show_error("{$path}
没有读取权限,请检查."); } elseif($status == 'rw') {//check wirte and read if(!is_writable($path) || !is_readable($path)) { core::show_error("{$path}
没有写入或读取权限,请检查"); } } } /** * 读取编译后模板的第一行 并分析成数组 * @param string $filepath 文件路径 * @param number $line 行数 * @return 返回指定行数的字符串 */ /* private function get_compile_header($filepath, $line = 0) { if(($file_arr = @file($filepath)) === false) { core::show_error($filepath.'
读取文件失败,请检查文件权限!'); } return $file_arr[0]; } */ /** * 分析头部注释的日期 * @param string $cotnent 编译文件头部第一行 * @return 返回上一次日期 */ /* private function get_compile_header_comment($content) { preg_match("/\/\*(.*?)\*\//", $content, $match); if(!isset($match[1]) || empty($match[1])) core::show_error('编译错误!'); $arr = explode('|', $match[1]); $arr_date = explode('##', $arr[0]); return $arr_date[1]; } */ /** * 获取模板完整路径 并返回已存在文件 * @param string $filename 文件名 * @param string $view_path 模板路径 * @return */ private function get_tpl($filename, $view_path) { empty($filename) && $filename = $this->tpl_name; //遍历模板路径 foreach($this->conf['view_path'] as $path) { if($view_path) {//直接从tpl跟目录找文件 $tpl_path = $path.$view_path; $view_file_path = $tpl_path.$filename.$this->_tpl_suffix; } else {//根据目录,控制器,方法开始找文件 $view_file_path = ($tpl_path = $this->get_tpl_path($path)) ? $tpl_path.$filename.$this->_tpl_suffix : exit(0); } if(is_file($view_file_path)) { //向指针传送模板路径和模板名称 $this->template_path = $tpl_path;// $this->template_name = $filename.$this->_tpl_suffix; return true; } else { core::show_error($filename.$this->_tpl_suffix.'模板不存在'); } } } /** * 获取模板路径 * @param string $path 主目录 * @return URL D和M的拼接路径 */ private function get_tpl_path($path = '') { core::get_directory_name() && $path_arr[0] = core::get_directory_name(); core::get_controller_name() && $path_arr[1] = core::get_controller_name(); (is_array($path_arr)) ? $newpath = implode('/', $path_arr) : core::show_error('获取模板路径失败!') ; return $path.$newpath.'/'; } /** * 创建目录 * @param string $path 目录 * @return */ private function create_dir($path, $mode = 0777){ if(is_dir($path)) return false; $dir_arr = explode('/', $path); $dir_arr = array_filter($dir_arr); $allpath = ''; $newdir = $this->template_c; foreach($dir_arr as $dir) { $allpath = $newdir.'/'.$dir; if(!is_dir($allpath)) { $newdir = $allpath; if(!@mkdir($allpath, $mode)) { core::show_error( $allpath.'
创建目录失败,请检查是否有可都写权限!'); } chmod($allpath, $mode); } else { $newdir = $allpath; } } return true; } public function __destruct(){ $this->vars = null; $this->view_path_param = null; }}

奇迹扩展源码,vscode 快捷加,ubuntu免费,tomcat网站日志,sqlite数据库vs,jquery 数字键盘插件,比较轻量级的前端框架,有什么驱赶爬虫的方法,php 判断用户名,seo优化论坛运营,win8网站取消导航,网页联机五子棋,织梦大气企业网站模板(扁平化风格)lzw

推荐阅读
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
  • CSS3 @font-face 字体应用技术解析与实践
    在Web前端开发中,HTML教程和CSS3的结合使得网页设计更加多样化。长期以来,Web设计师受限于“web-safe”字体的选择。然而,CSS3中的`@font-face`规则允许从服务器端加载自定义字体,极大地丰富了网页的视觉效果。通过这一技术,设计师可以自由选择和使用各种字体,提升用户体验和页面美观度。本文将深入解析`@font-face`的实现原理,并提供实际应用案例,帮助开发者更好地掌握这一强大工具。 ... [详细]
  • 优化后的标题:利用 jQuery 实现高效树形结构元素选择与操作
    在Web前端开发中,DOM结构本质上是一种树形结构。通过优化后的jQuery选择器,可以高效地选择和操作DOM树中的节点。这些选择器不仅简化了代码编写,还提高了性能和可维护性。本文将详细介绍如何利用jQuery的树形选择器实现高效的元素选择与操作。 ... [详细]
  • 实现Nginx对ThinkPHP URL重写及PATHINFO支持的详细方法解析【PHP开发】
    在PHP后端开发中,实现Nginx对ThinkPHP的URL重写及PATHINFO支持是一项常见的需求。本文详细解析了经过多次尝试和研究,最终找到的一种有效配置方法,能够确保URL_MODERewrite功能正常运行,并提供稳定的服务。此外,文章还探讨了相关配置项的具体作用及其优化建议,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 在MySQL中实现时间比较功能的详细解析与应用
    在MySQL中实现时间比较功能的详细解析与应用。本文深入探讨了MySQL中时间比较的实现方法,重点介绍了`UNIX_TIMESTAMP`函数的应用。该函数可以接收一个日期时间参数,也可以不带参数使用,其返回值为Unix时间戳,便于进行时间的精确比较和计算。此外,文章还涵盖了其他相关的时间处理函数和技巧,帮助读者更好地理解和掌握MySQL中的时间操作。 ... [详细]
  • MySQL 数据变更后如何实现实时同步至 Elasticsearch
    在 MySQL 数据变更后,如何实现与 Elasticsearch 的实时同步是一个常见的需求。本文介绍了通过配置 MySQL 的 Binlog 功能,结合中间件如 Canal 或 Debezium,将数据变更事件实时捕获并同步到 Elasticsearch 中的方法。此外,还探讨了如何处理数据删除操作,确保 Elasticsearch 中的数据与 MySQL 保持一致。文章还简要对比了 VSCode 和 Dev 两种开发环境的优缺点,为开发者提供参考。 ... [详细]
  • IPv4地址由多少个二进制位构成及其技术细节解析
    本文详细解析了IPv4地址的构成及其技术细节,重点阐述了IPv4地址由32个二进制位组成,并探讨了其在网络通信中的应用和相关技术背景。同时,文章还介绍了IPv4地址的子网划分、地址分类以及常见的配置方法,为读者提供了全面的技术参考。 ... [详细]
  • Norton Partition Magic 中 PHP 函数 error_reporting(E_ALL ^ E_NOTICE) 的详细解析与应用
    在 Windows 环境下,通过具体示例分析了 `Norton Partition Magic` 中 `PHP` 函数 `error_reporting(E_ALL ^ E_NOTICE)` 的详细解析与应用。该函数用于控制错误报告级别,例如在从 PHP 4.3.0 升级到 4.3.1 后,程序出现多处错误的原因及解决方法。本文深入探讨了错误报告配置对程序稳定性的影响,并提供了实用的调试技巧。 ... [详细]
  • 本文详细解析了如何使用 jQuery 实现一个在浏览器地址栏运行的射击游戏。通过源代码分析,展示了关键的 JavaScript 技术和实现方法,并提供了在线演示链接供读者参考。此外,还介绍了如何在 Visual Studio Code 中进行开发和调试,为开发者提供了实用的技巧和建议。 ... [详细]
  • 如何使用Python高效绘制矩形图形
    本文详细介绍了如何利用Python的Turtle库高效绘制矩形图形,适合初学者快速上手。通过具体示例代码,帮助读者理解Turtle库的基本绘图方法和技巧,同时探讨了在不同应用场景中绘制矩形的实际操作,为后续复杂图形的绘制打下坚实基础。 ... [详细]
  • 浅析PHP中$_SERVER[
    在PHP后端开发中,`$_SERVER["HTTP_REFERER"]` 是一个非常有用的超级全局变量,它可以获取用户访问当前页面之前的URL。本文将详细介绍该变量的使用方法及其在不同场景下的应用,如页面跳转跟踪、安全验证和用户行为分析等。通过实例解析,帮助开发者更好地理解和利用这一功能。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • PHP服务接口的专业测试方法与实践 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
author-avatar
谁的FrankyCH
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有