之前就觉得TP的那个模板引擎太不爽了,非常的蛋疼,所以参照PHPCMS的改了下,哈哈,自己看吧 无 /** * 模板函数 * @param string $template 模板文件名 * @param string $path 模板路径 * @param string $suffix 模板后缀 */function template($template = '', $p
之前就觉得TP 的那个模板引擎太不爽了,非常的蛋疼,所以参照PHPCMS的 改了下, 哈哈,自己看吧
/**
* 模板函数
* @param string $template 模板文件名
* @param string $path 模板路径
* @param string $suffix 模板后缀
*/
function template($template = '', $path = '', $suffix = '', $show_error = true) {
$tpl_path = $path ? $path : (config('tpl_path') ? config('tpl_path') : './template/');
$tpl_suffix = $suffix ? $suffix : (config('tpl_suffix') ? config('tpl_suffix') : '.html');
if (empty($template)) {
$template_file = $tpl_path . __MODULE__ . '/' . __CONTROLLER__ . '/' . __ACTION__;
} else {
if (!$path) {
$pcount = substr_count($template, '/');
if ($pcount == 0) {
$template_file = $tpl_path . __MODULE__ . '/' . __CONTROLLER__ . '/' . trim($template, '/');
} else if ($pcount == 1) {
$template_file = $tpl_path . __MODULE__ . '/' . trim($template, '/');
} else {
$template_file = $tpl_path . trim($template, '/');
}
} else {
$template_file = $path . trim($template, '/');
}
}
$template_file .= $tpl_suffix;
if (!is_file($template_file)) {
if ($show_error === true) {
halt('模板文件不存在:' . $template_file);
}
} else {
$cache_template = DATA_PATH . 'cache' . _DIR . 'template' . _DIR . __MODULE__ . _DIR . md5($template_file) . '.php';
if (is_file($cache_template) && config('tpl_cache') == true && (config('tpl_expire') == 0 || (@filemtime($cache_template) + config('tpl_expire')) < time())) {
} else {
template::template_compile($template_file, $cache_template);
}
return $cache_template;
}
}<?php
class template {
/**
* 编译模板
* @param string $template_file 模板文件
* @param string $cache_file 缓存文件
*/
public static function template_compile($template_file, $cache_file) {
if (!is_file($template_file)) {
return false;
}
$content = file_get_contents($template_file);
$cache_dir = dirname($cache_file);
if (!is_dir($cache_dir)) {
mkdir($cache_dir, 0777, true);
}
$content = self::parse_template($content);
@file_put_contents($cache_file, $content);
return $cache_file;
}
public static function parse_template($str) {
//include
$str = preg_replace("/{templates+(.+)}/", "<?php include template(\1,'','','',false); ?>", $str);
$str = preg_replace("/{includes+(.+)}/", "<?php include \1; ?>", $str);
$str = preg_replace("/{phps+(.+?)}/", "<?php \1?>", $str);
$str = preg_replace("/{!(.+?)}/", "<?php \1?>", $str);
$str = preg_replace("/{ifs+(.+?)}/", "<?php if(\1) { ?>", $str);
$str = preg_replace("/{else}/", "<?php } else { ?>", $str);
$str = preg_replace("/{elseifs+(.+?)}/", "<?php } elseif (\1) { ?>", $str);
$str = preg_replace("/{/if}/", "<?php } ?>", $str);
//for
$str = preg_replace("/{fors+(.+?)}/", "<?php for(\1) { ?>", $str);
$str = preg_replace("/{/for}/", "<?php } ?>", $str);
//++ --
$str = preg_replace("/{++(.+?)}/", "<?php ++\1; ?>", $str);
$str = preg_replace("/{--(.+?)}/", "<?php ++\1; ?>", $str);
$str = preg_replace("/{(.+?)++}/", "<?php \1++; ?>", $str);
$str = preg_replace("/{(.+?)--}/", "<?php \1--; ?>", $str);
//loop
$str = preg_replace("/{loops+(S+)s+(S+)}/", "<?php $n=1;if(is_array(\1)) foreach(\1 AS \2) { ?>", $str);
$str = preg_replace("/{loops+(S+)s+(S+)s+(S+)}/", "<?php $n=1; if(is_array(\1)) foreach(\1 AS \2 => \3) { ?>", $str);
$str = preg_replace("/{/loop}/", "<?php $n++;}unset($n); ?>", $str);
//函数
$str = preg_replace("/{:([a-zA-Z_-][a-zA-Z0-9_-:]*(([^{}]*)))}/", "<?php echo \1;?>", $str);
$str = preg_replace("/{~([a-zA-Z_-][a-zA-Z0-9_-:]*(([^{}]*)))}/", "<?php \1;?>", $str);
//变量
$str = preg_replace("/{\$([a-zA-Z_-][a-zA-Z0-9_-:]*(([^{}]*)))}/", "<?php echo \1;?>", $str);
$str = preg_replace("/{(\$[a-zA-Z_-][a-zA-Z0-9_-]*)}/", "<?php echo \1;?>", $str);
$str = preg_replace("/{\$([a-zA-Z_-][a-zA-Z0-9_-:]*->[a-zA-Z_-][a-zA-Z0-9_-:])}/", "<?php echo \1;?>", $str);
$str = preg_replace("/{(\$[a-zA-Z_-][a-zA-Z0-9_-]*)|([^{}]*)}/", "<?php if(!empty(\1)){echo \1;}else{echo \2;}?>", $str);
$str = preg_replace('/{(\$[a-zA-Z_-][a-zA-Z0-9_-]*(?:->)[^}]+)}/',"<?php echo \1;?>", $str);
//数组
$str = preg_replace("/{(\$[a-zA-Z0-9_[]'"$-]+)}/es", "self::addquote('<?php echo \1;?>')", $str);
$str = preg_replace("/{(\$[a-zA-Z0-9_[]'"$-]+)|([^{}]*)}/es", "self::addquote('<?php if(!empty(\1)){echo \1;}else{echo \2;} ?>')", $str);
//常量
$str = preg_replace("/{([A-Z_-][A-Z0-9_-]*)}/s", "<?php echo \1;?>", $str);
//扩展标签
$str = preg_replace("/{tag:(w+)s+([^}]+)}/ie", "self::tag('$1','$2')", $str);
$str = preg_replace("/{:tag:(w+)s+([^}]+)}/ie", "self::tag('$1','$2',true)", $str);
return $str;
}
public static function addquote($var) {
return str_replace("\"", """, preg_replace("/[([a-zA-Z0-9_-.-]+)]/s", "['\1']", $var));
}
public static function tag($name, $data, $echo = false) {
preg_match_all("/([a-z]+)=["]?([^"]+)["]?/i", stripslashes($data), $matches, PREG_SET_ORDER);
foreach ($matches as $v) {
if (in_array($v[1], array('action', 'cache', 'return'))) {
$$v[1] = $v[2];
continue;
}
$datas[$v[1]] = $v[2];
}
if (!isset($action) || empty($action)) { //方法
return false;
}
if (isset($cache)) { //缓存
$cache = intval($cache);
} else {
$cache = false;
}
if (!isset($return) || empty($return)) {
$return = '$data';
}
$tag_file = EXT_PATH . 'tags' . _DIR . $name . '_tag' . EXT;
if (!is_file($tag_file)) {
return false;
}
$str = '<?php ';
if ($cache !== false) {
$cache_name = 'tag/'.$name.'_'.$action. to_guid_string($datas);
$str .= '$cache = cache::getInstance();';
$str .= $return . '=$cache->get("' . $cache_name . '");';
$str .= 'if(' . $return . ' === false){';
$str .= '$params = ' . self::filter_var($datas) . ';';
$str .= '$tag = load_ext("tags/' . $name . '_tag",true);';
$str .= $return . '=$tag->' . $action . '($params);';
$str .= '$cache->set("' . $cache_name . '",' . $return . ',' . $cache . ');';
$str .= '}';
if ($echo == true) {
$str .= 'echo ' . $return . ';';
}
$str .= ' ?>';
} else {
$str .= '$params = ' . self::filter_var($datas) . ';';
$str .= '$tag = load_ext("tags/' . $name . '_tag",true);';
if ($echo) {
$str .= 'echo $tag->' . $action . '($params);';
} else {
$str .= $return . '=$tag->' . $action . '($params);';
}
$str .= ' ?>';
}
return $str;
}
protected static function filter_var($data) {
$str = var_export($data, true);
//$str = preg_replace('/'$(w+?)'/', "$\1", $str);
$str = preg_replace('/'/', '"', $str);
$str = preg_replace('/s{2,}/', '', $str);
return $str;
}
}
public function test(){
include template();
}{if !empty($result)}
{loop $result $r}
<tr>
<td>{$r['order_sn']}</td>
<td>{$r['name']}</td>
<td>{$r['mobile']}</td>
<td>{:fdate($r['add_time'])}</td>
<td>{if $r['status'] == 0}处理中{elseif $r['status'] ==1}已处理{else}无效{/if}</td>
</tr>
{/loop}
{else}
<tr>
<td colspan="9">
<span style="padding:10px; display:block;">您还没有收到任何预约</span>
</td>
</tr>
{/if}
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号