`
mengdejun
  • 浏览: 408352 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

phpnew模板引擎类

    博客分类:
  • Php
阅读更多
<?php
/*
# @category: 分享工作室;
# @copyright: 分享在线传媒公社;
# @var; PHPnew.class ;
# @version: PHPnew 7.0 Professional;
*/
//模板引擎解析类;
class PHPnew 
{
	const PHP = 5;						//PHP限制版本;
	public $templates_dir = 'Templates/default/'; 			//模板路径;
	public $templates_cache = 'Data/cache_tpl/'; 		//缓存模板路径;
	public $templates_default = 'Templates/default/'; 		//默认模板路径;
	public $templates_new = true; 							//设置当次更新;
	public $templates_time = 360;				//过期时间,分钟计算;
	//以下的默认设置
	public $templates_charset = 'utf-8';
	public $templates_postfix = '.html'; 		//模板后缀;
	public $templates_auto = true;				//自动更新模板;
	public $templates_caching = '.php';			//缓存后缀;
	public $templates_debug = array();			//错误信息;
	public $templates_lonlabel = true;			//长标签;
	public $templates_space = false;			//清除无意义字符
	public $templates_php = false;				//为每个缓存头部增加PHP码;
	//结果集;
	public $templates_file = array();					//模板文件
	public $templates_cache_file = null;          		//缓存文件;
	public $templates_name = null;						//标识名
	public $templates_message = null;					//html内容;
	public $templates_update = 0;						//更新次数
	public $templates_assign = array();					//用户用smarty模式;
	public $PHPnew = 'PHPnew 7.0 Professional';
	//缓存控制;
	public $templates_menu = array();					//用于记录每个模板信息;
	public $templates_replace = array();				//用于智能更新,可以将模板中的内容直接替换;
	//构造函数
	public function __construct()
	{
		// 确认php版本,低过设置的, 就提供一下debug出去。但不终止。
		if((int) phpversion() < self::PHP)
		$this->templates_debug[] = 'PHP version is too low ' .self::PHP;
		//为属性作初级判断;
		$this->templates_auto = (boolean) $this->templates_auto;
		$this->templates_lonlabel = (boolean) $this->templates_lonlabel;
		$this->templates_space = (boolean) $this->templates_space;
		$this->templates_new = (boolean) $this->templates_new;

		//禁止默认模板目录不存在
		is_dir($this->templates_default) === false && exit('error templates_default');

		//为控制设置流程,先引入配置文件, 里面记录着所有缓存文件的时间。
		if(is_file($this->templates_cache.'templates_caceh.php') && $this->templates_auto===true)
		$this->templates_menu = include($this->templates_cache.'templates_caceh.php');
	}
	
	//解析开始;
	public function display($file_name){
		// 初始化先设置变量信息
		$var_list = $this->parse_var();
		//取得路径;
		$this->templates_file[$file_name] = $this->get_path($file_name);
		//取得文件名字;
		$this->templates_name = $file_name;

		//取得缓存路径;
		$this->templates_cache_file[$file_name] = $this->get_path();
		
		// 如果不自动更新,就直接调用缓存。
		if($this->templates_auto===false){
			return $this->view($this->templates_cache_file[$file_name]);
		}
		
		//如果设置了当次更新,就将配置数组清空.
		if($this->templates_new===true){
			$this->templates_menu = array();
		}
		
		//判断一下文件是否存在。 是否已经过期,然后生成并且显示。
		if($this->check($this->templates_name)===true){
			return $this->view($this->templates_cache_file[$file_name]);
		}

		$this->templates_message = null;
		if(is_file($this->templates_file[$this->templates_name]) == true)
		$this->templates_message = $this->replace_html(file_get_contents($this->templates_file[$this->templates_name],LOCK_EX));
		
		$this->templates();
		return	$this->view($this->fileplus());
	}

	//显示出来;
	private function view($path_php){
		//释放数组内容。
		if(empty($this->templates_assign) === false)
			extract($this->templates_assign,EXTR_OVERWRITE);
		if(is_file($path_php) === true){
			include($path_php);
		}else {
			print $path_php.' Does not exist<br>';
		}
		return true;
	}

	private function parse_var(){
		static $var_list;
		if(empty($var_list) === true){ 
			$list = array();
			foreach ($GLOBALS as $key => $val)
			{
				$list[$key] = $val;
			}
			$var_list = $list;
			foreach ($var_list as $phpnew_key =>$phpnew_value){
				$this->assign($phpnew_key,$phpnew_value);
			}
		}
		return $this->templates_assign;
	}
	//生成缓存
	private function fileplus()
	{
		file_put_contents($this->templates_cache_file[$this->templates_name],$this->templates_message,LOCK_EX);
		$this->templates_message = array();
		return $this->templates_cache_file[$this->templates_name];
	}

	//控制配置
	private function templates(){
		if(empty($this->templates_menu[$this->templates_name]) === false)
		unset($this->templates_menu[$this->templates_name]);
		if(is_array($this->templates_menu)===false)
		$this->templates_menu = array();
		if(is_file($this->templates_file[$this->templates_name]) == true)
		$this->templates_menu[$this->templates_name] = md5_file($this->templates_file[$this->templates_name]);

		if(($php = null) && empty($this->templates_php) === false)
		$php = $this->templates_php."\r\n";
		file_put_contents($this->templates_cache.'templates_caceh.php',
		sprintf($php."<?php \r\n return %s;",var_export($this->templates_menu,true)),LOCK_EX);
	}

	//路径处理
	private function get_path($file_name=null){
		//为默认路径做完整路径抓取;
		$this->path();
		if($file_name!==null){
			$file_all = $this->templates_dir.$file_name.$this->templates_postfix;
			if($this->templates_dir===null || is_file($file_all)===false){
				$file_all = realpath($this->templates_default).DIRECTORY_SEPARATOR.$file_name.$this->templates_postfix;
			}
			if(is_file($file_all)===false){
				return false;
				$this->templates_debug[] = 'Template file does not exist or an error';
			}
			return (string) $file_all;
		}else {
			$file = $this->templates_file[$this->templates_name];
			$file_arr = pathinfo($file);
			$postfix = basename(dirname($file));
			return $this->templates_cache.$postfix.'_'.$this->templates_name.'_cache'.$this->templates_caching;
		}
		return false;
	}
	// 路径规范处理;
	private function path(){
		$this->templates_dir = realpath(strtr($this->templates_dir,array('./'=>'','//'=>'/','\\\\'=>'\\'))).DIRECTORY_SEPARATOR;
		$this->templates_cache = realpath(strtr($this->templates_cache,array('./'=>'','//'=>'/','\\\\'=>'\\'))).DIRECTORY_SEPARATOR;
		// 不能判断目录是否存在, 因为还有默认目录功能。
		if(strlen($this->templates_dir)<=2)
		exit('Catalog Error');
		if(strlen($this->templates_cache)<=2)
		exit('Catalog Error');
	}
	//控制判断
	private function check($name){
		//对文件及目录判断
		if(strlen($this->templates_name)===0){
			$this->templates_name = 'index';
		}

		// 检查默认模板目录是否存在
		if(is_dir($this->templates_dir)===false){
			exit('Templates directory does not exist');
		}
		// 检查缓存模板目录是否存在
		if(is_dir($this->templates_cache)===false){
			exit('Template cache directory does not exist');
		}

		// 判断缓存文件是否存在,不存在就报错.
		if(is_file($this->templates_file[$name])===false){
			exit('Template does not exist: '.$name);
		}
		// true 让判断成真,即返回缓存文件 // false 将执行编译;
		if(empty($this->templates_menu)===true)
		return false;

		if(time() - fileatime($this->templates_cache.'templates_caceh.php')>=$this->templates_time*60){
			if(is_file($this->templates_cache.'templates_caceh.php') === true)
			unlink($this->templates_cache.'templates_caceh.php');
			return false;
		}
		if(empty($this->templates_menu[$name]) === false && md5_file($this->templates_file[$name])===$this->templates_menu[$name]){
			return true;
		}

		return false;
	}

	//假如用户用强制性;
	public function assign($phpnew_var,$phpnewvalue=null){
		$php_key = $php_val = null;
		if($phpnew_var=='')
		return false;
		if(is_array($phpnew_var)===true){
			foreach ($phpnew_var as $php_key => $php_val){
				if(is_array($php_val)===true){
					$this->assign($php_val);
				}
				if(is_numeric($php_key)===false || $php_key{0}!='_')
				$this->templates_assign[$php_key] = $php_val;
			}
		}else {
			if(is_numeric($phpnew_var)===false || $phpnew_var{0}!='_')
			$this->templates_assign[$phpnew_var] = $phpnew_value;
		}
	}

	//替换函数;
	protected function replace_html($template){
		//替换
		$template = preg_replace(
		"/[\n\r\t]*\{templatesub\s+(.+)\}[\n\r\t]*/iseU",
		"\$this->get_contents('$1')",
		$template
		);
		//直接输出php
		$template = preg_replace('/[\n\r\t]*\<\?php.*\\?\>[\n\r\t]*/iseU',
		'\'[php]\'.base64_encode(\'$0\').\'[/php]\'',
		$template
		);

		//静态替换
		$template = preg_replace(
		"/[\n\r\t]*\{html\s+(.+?)\}[\n\r\t]*/ise",
		"\$this->get_var('$1')",
		$template
		);
		//替换模板载入命令
		$template = preg_replace(
		"/[\n\r\t]*\{template\s+\\$(.+)\}[\n\r\t]*/isU",
		'<? include display(-%-$1); ?>',
		$template
		);
		$template = preg_replace(
		"/[\n\r\t]*\{template\s+(.+)\}[\n\r\t]*/isU",
		"<? include display('$1'); ?>",
		$template
		);

		//过滤 <!--{}-->
		$template = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}", $template);
		//替换 PHP 换行符
		$template = str_replace("{LF}", "<?=\"\\n\"?>", $template);
		//替换直接变量输出
		$varRegexp = "((\\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)"
		. "(\[[a-zA-Z0-9_\-\.\"\'\[\]\$\x7f-\xff]+\])*)";
		$template = preg_replace("/\{(\\\$[a-zA-Z0-9_\[\]\'\"\$\.\x7f-\xff]+)\}/s", "<?=\\1?>", $template);
		$template = preg_replace("/$varRegexp/es", "\$this->addquote('<?=\\1?>')", $template);
		$template = preg_replace("/\<\?\=\<\?\=$varRegexp\?\>\?\>/es", "\$this->addquote('<?=\\1?>')", $template);
		//替换语言包变量
		$template = preg_replace("/\{lang\s+(.+?)\}/is", "<?=\$language['\\1']?>", $template);
		//替换特定函数
		$template = preg_replace(
		"/[\n\r\t]*\{eval\s+(.+?)\}[\n\r\t]*/ies",
		"\$this->stripvtags('<? \\1; ?>','')",
		$template
		);
		$template = preg_replace(
		"/[\n\r\t]*\{echo\s+(.+?)\}[\n\r\t]*/ies",
		"\$this->stripvtags('<? \\1; ?>','')",
		$template
		);
		$template = preg_replace(
		"/([\n\r\t]*)\{elseif\s+(.+?)\}([\n\r\t]*)/ies",
		"\$this->stripvtags('\\1<? } elseif(\\2) { ?>\\3','')",
		$template
		);
		$template = preg_replace(
		"/([\n\r\t]*)\{else\}([\n\r\t]*)/is",
		"\\1<? } else { ?>\\2",
		$template
		);
		//替换循环函数及条件判断语句
		for ($i = 0; $i < 6; $i++) {
			$template = preg_replace(
			"/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\}[\n\r]*(.+?)[\n\r]*\{\/loop\}[\n\r\t]*/ies",
			"\$this->stripvtags('<? if(is_array(\\1)) { foreach(\\1 as \\2) { ?>','\\3<? } } ?>')",
			$template
			);
			$template = preg_replace(
			"/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}[\n\r\t]*(.+?)[\n\r\t]*\{\/loop\}[\n\r\t]*/ies",
			"\$this->stripvtags('<? if(is_array(\\1)) { foreach(\\1 as \\2 => \\3) { ?>','\\4<? } } ?>')",
			$template
			);
			$template = preg_replace(
			"/([\n\r\t]*)\{if\s+(.+?)\}([\n\r]*)(.+?)([\n\r]*)\{\/if\}([\n\r\t]*)/ies",
			"\$this->stripvtags('\\1<? if(\\2) { ?>\\3','\\4\\5<? } ?>\\6')",
			$template
			);
		}
		//常量替换
		$template = preg_replace(
		"/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/s",
		"<?=\\1?>",
		$template
		);
		//删除 PHP 代码断间多余的空格及换行
		$template = preg_replace("/ \?\>[\n\r]*\<\? /s", " ", $template);

		//其他替换
		$template = preg_replace(
		"/\"(http)?[\w\.\/:]+\?[^\"]+?&[^\"]+?\"/e",
		"\$this->transamp('\\0')",
		$template
		);
		$template = preg_replace(
		"/\<script[^\>]*?src=\"(.+?)\".*?\>\s*\<\/script\>/ise",
		"\$this->stripscriptamp('\\1')",
		$template
		);
		$template = preg_replace(
		"/[\n\r\t]*\{block\s+([a-zA-Z0-9_]+)\}(.+?)\{\/block\}/ies",
		"\$this->stripblock('\\1', '\\2')",
		$template
		);
		$template = preg_replace('/[\n\r\t]*\[php\](.*)\[\/php\][\n\r\t]*/iseU','base64_decode(\'\\1\')',$template);
		$template = preg_replace('/<script.+script>/iseU','\'[script]\'.base64_encode(\'$0\').\'[/script]\'',$template);
		if ($this->templates_space===true) {
			$template = preg_replace(
			array('/\r\n/isU','/<<<EOF/isU'),array('',"\r\n<<<EOF\r\n"),$template);
		}
		$template = preg_replace('/[\n\r\t]*\[script\](.+)\[\/script\][\n\r\t]*/iseU','base64_decode(\'$1\')',$template);
		$template = strtr($template,array('-%-'=>'$','\"'=>'"','<style>'=>'<style type="text/css">','<script>'=>'<script type="text/javascript">'));
		if(empty($this->templates_php) === false)
		$template = $this->templates_php."\r\n".$template;

		$template = strtr($template,array('include display'=>'$this->display'));
		if($this->templates_lonlabel===true){
			$template = strtr($template,
			array('<?php'=>'<?','<?php echo'=>'<?='));
			$template = strtr($template,
			array('<?'=>'<?php ','<?='=>'<?php echo '));
		}
		$template = strtr($template,$this->templates_replace);
		$this->templates_update +=1;
		return (string) $template;
	}
	//模板引擎需要的函数. 开始.
	protected function get_contents($filename){
		$this->templates_file[$filename] = $this->get_path($filename);
		if(is_file($this->get_path($filename)) === true){
			$files = file_get_contents($this->templates_file[$filename],LOCK_EX);
			//替换
			$files = preg_replace(
			"/[\n\r\t]*\{templatesub\s+(.+)\}[\n\r\t]*/iseU",
			"\$this->get_contents('$1')",
			$files
			);
			return $files;
		}
		return false;
	}
	protected function get_var($phpnew_name){
		if(empty($this->templates_assign[$phpnew_name]) === false)
			return $this->templates_assign[$phpnew_name];
		return 'Static variable is not defined';
	}
	protected function transamp($template) {
		$template = str_replace('&', '&amp;', $template);
		$template = str_replace('&amp;amp;', '&amp;', $template);
		$template = str_replace('\"', '"', $template);
		return $template;
	}
	protected function stripvtags($expr, $statement) {
		$expr = str_replace("\\\"", "\"", preg_replace("/\<\?\=(\\\$.+?)\?\>/s", "\\1", $expr));
		$statement = str_replace("\\\"", "\"", $statement);
		return $expr . $statement;
	}

	protected function addquote($var) {
		return str_replace("\\\"", "\"", preg_replace("/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s", "['\\1']", $var));
	}

	protected function stripscriptamp($s) {
		$s = str_replace('&amp;', '&', $s);
		return "<script src=\"$s\" type=\"text/javascript\"></script>";
	}

	protected function stripblock($var, $s) {
		$s = str_replace('\\"', '"', $s);
		$s = preg_replace("/<\?=\\\$(.+?)\?>/", "{\$\\1}", $s);
		preg_match_all("/<\?=(.+?)\?>/e", $s, $constary);
		$constadd = '';
		$constary[1] = array_unique($constary[1]);
		foreach($constary[1] as $const) {
			$constadd .= '$__' . $const  .' = ' . $const . ';';
		}
		$s = preg_replace("/<\?=(.+?)\?>/", "{\$__\\1}", $s);
		$s = str_replace('?>', "\n\$$var .= <<<EOF\n", $s);
		$s = str_replace('<?', "\nEOF;\n", $s);
		return "<?php\n$constadd\$$var = <<<EOF" . $s . "\nEOF;\n?>";
	}


	//删除缓存;
	public function cache_dele($path = null){
		if($path===null){
			$path = $this->templates_cache;
		}
		$file_arr = scandir($path);
		foreach ($file_arr as $val){
			if($val === '.' || $val === '..'){
				continue;
			}
			if(is_dir($path.$val)===true)
			$this->cache_dele($path.$val.'/');
			if(is_file($path.$val)===true && $val!=='index.html')
			unlink($path.$val);
		}
	}
	public function __destruct(){}
}

 

分享到:
评论

相关推荐

    phpnew模板引擎类.zip

    本文将深入探讨PHPNew模板引擎类的核心概念、工作原理以及如何在实际项目中应用。 一、PHPNew模板引擎概述 PHPNew模板引擎通过解析特定的模板语法,将HTML与PHP代码分离,让开发者能够专注于页面布局和设计,而...

    php自定义模板引擎类.zip

    本教程将详细解析一个名为“php自定义模板引擎类”的压缩包内容,该类库是为PHP设计的一个自定义模板处理系统。 首先,模板引擎的核心理念在于,它提供了一种方式来编写包含动态内容的HTML或其他类型的视图文件,...

    PHPnew 模板引擎 v7.3.1.zip

    **PHPnew 模板引擎 v7.3.1** PHPnew 模板引擎是一款专为 PHP 开发者设计的高效、轻量级的模板处理工具,它允许开发者将业务逻辑与视图展示分离,提高代码的可读性和可维护性。在 v7.3.1 版本中,该引擎可能包含了一...

    PHP实例开发源码-PHPnew 模板引擎.zip

    PHPnew 模板引擎是这种理念的一个具体实现,下面我们将深入探讨这个模板引擎的相关知识点。 首先,模板引擎的基本概念是,它允许开发者使用一种特定的模板语言来编写视图层的代码,这种语言通常简化了HTML的编写,...

    PHPnew模板引擎.7z

    PHPnew模板引擎是一种用于PHP开发的模板处理工具,它的设计目标是将HTML代码与PHP代码分离,让开发者能够更专注于页面的布局和设计,而不用在HTML中混杂大量的PHP逻辑。这种模板引擎有助于提高代码的可读性和可维护...

    PHPnew 模板引擎 v7.2.rar

    模板引擎支持smarty, 原生态php,discuz模式,三种使用习惯均可以交叉使用。 精小模板,适合二次整合。 7.2 更新日志: 1: 修正变量战用内存过多的问题 2: 流程判断更加精简 3: 加强安全性检测 安装使用...

    PHPnew(PHP模板处理引擎) 7.0.rar

    PHPnew是一款PHP类简易式模板处理引擎,整体实现原理源于discuz程序的思想,90%的模板语法均来自discuz的程序仿制,这也将为引擎的简易性做了最足的基础准备。引擎无需配置即可使用,兼容性强,扩展方便,功能更是非常人性...

    PHPnew模板引擎 7.3.1.zip

    PHPnew模板引擎 7.3.1 更新日志: 1: 兼容PHP5.5 , 为更新版本兼容做准备. 2: 模板并发写入优化更新, 防止卡住或者崩溃情况发生. 3: css, js引用增加模板语法功能, 引入流程更如人所想. 4: 增加Todo, buy等标注...

    基于PHP的new模板引擎源码.zip

    【标题】"基于PHP的new模板引擎源码.zip"揭示了一个关键知识点,即PHP模板引擎的实现。模板引擎是Web开发中的一个重要组成部分,它允许开发者将业务逻辑与展示逻辑分离,使得网页设计更加灵活和可维护。在这个压缩包...

    PHPnew 模板引擎 v7.3.1

    Phpnew 是一款简易而智能的模板引擎,它来自discuz的引擎原理,经过后期长时间优化重写,演变为可以独立使用的模板化工具。经过长期的项目运行优化及实践,phpnew已经在人性化上更为突出,无需配置即可使用,让新手...

    PHPnew模板引擎 v6.0 Professional.rar

    Phpnew 是一款简易而强大的模板引擎,它来自discuz的引擎原理,经过后期重组,演变为可以独立使用的模板化工具。经过长期的修整及重组,phpnew已经在人性化上更为突出,无需配置即可使用,让新手更容易上手且熟悉。...

    php自定义模板引擎类

    下面我们将深入探讨PHP自定义模板引擎类的设计和实现。 首先,我们需要理解模板引擎的基本原理。模板引擎通常接收一个HTML文件(模板),其中包含一些特殊的语法或标记,这些标记会被解析并替换为实际的动态数据。...

    基于PHP的new 模板引擎.zip

    "基于PHP的new 模板引擎"是一个专为PHP设计的模板系统,它旨在分离应用的业务逻辑与视图展示,提高代码的可读性和维护性。下面将详细介绍这个模板引擎的工作原理、优势以及如何在实际项目中应用。 模板引擎的核心...

    基于PHP的new 模板引擎 v7.3.1.zip

    在这个“基于PHP的new 模板引擎 v7.3.1.zip”中,我们讨论的是一个针对PHP编程环境设计的新版本模板引擎,它可能包含了优化的性能和新特性。 【模板引擎的优势】 1. **代码分离**:模板引擎使得PHP代码和HTML代码...

    基于PHP的new模板引擎v7.3.1源码.zip

    "基于PHP的new模板引擎v7.3.1"就是这样一个工具,它旨在优化PHP代码结构,提高渲染速度,并降低前端与后端的耦合度。 首先,我们需要理解模板引擎的基本概念。模板引擎是将HTML和业务逻辑分离的一种设计模式,它...

    PHP模板引擎PHPnew v6.5 Professional.rar

    Phpnew 是一款简易而强大的模板引擎,它来自discuz的引擎原理,经过后期重组,演变为可以独立使用的模板化工具。经过长期的修整及重组,phpnew已经在人性化上更为突出,无需配置即可使用,让新手更容易上手且熟悉。...

    PHPnew 模板引擎 v7.0.rar

    PHPnew 7.0 在原有基础进行更大的更新及结构变化,使得速度及效率都有明显的提高.同时为程序开发配备常用函数及设置,开发中仅需要直接采用即可.新版本拥有着缓存,模板重编,及模板缓存几个大的功能,同时,对于模板缓存,...

    PHPnew(PHP模板处理引擎).7z

    在压缩包"PHPnew(PHP模板处理引擎)"中,可能包含的是一个自定义的PHP模板处理系统或者是对现有模板引擎的扩展或修改。如果你打算学习或使用这些源码,建议先了解其基本架构和工作流程,然后逐步深入研究各个组件,...

    PHP模板引擎PHPnew v5.0.rar

    PHPnew 5.0 在原有基础进行更大的更新及结构变化,使得速度及效率都有明显的提高.同时为程序开发配备常用函数及设置,开发中仅需要直接采用即可.新版本拥有着缓存,模板重编,及模板缓存几个大的功能,同时,对于模板缓存,...

Global site tag (gtag.js) - Google Analytics