php 模板引擎正则,模板引擎?No 正则而已

之前就觉得TP 的那个模板引擎太不爽了,非常的蛋疼,所以参照PHPCMS的 改了下, 哈哈,自己看吧

1.[代码]模板函数

/**

* 模板函数

* @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;

}

}

2.[代码]模板解析类

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("/\{template\s+(.+)\}/", "<?php include template(\\1,'','','',false); ?>", $str);

$str = preg_replace("/\{include\s+(.+)\}/", "<?php include \\1; ?>", $str);

$str = preg_replace("/\{php\s+(.+?)\}/", "<?php \\1?>", $str);

$str = preg_replace("/\{!(.+?)\}/", "<?php \\1?>", $str);

$str = preg_replace("/\{if\s+(.+?)\}/", "<?php if(\\1) { ?>", $str);

$str = preg_replace("/\{else\}/", "<?php } else { ?>", $str);

$str = preg_replace("/\{elseif\s+(.+?)\}/", "<?php } elseif (\\1) { ?>", $str);

$str = preg_replace("/\{\/if\}/", "<?php } ?>", $str);

//for

$str = preg_replace("/\{for\s+(.+?)\}/", "<?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("/\{loop\s+(\S+)\s+(\S+)\}/", "<?php \$n=1;if(is_array(\\1)) foreach(\\1 AS \\2) { ?>", $str);

$str = preg_replace("/\{loop\s+(\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_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php echo \\1;?>", $str);

$str = preg_replace("/\{~([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php \\1;?>", $str);

//变量

$str = preg_replace("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php echo \\1;?>", $str);

$str = preg_replace("/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/", "<?php echo \\1;?>", $str);

$str = preg_replace("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\->[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:])\}/", "<?php echo \\1;?>", $str);

$str = preg_replace("/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|([^{}]*)\}/", "<?php if(!empty(\\1)){echo \\1;}else{echo \\2;}?>", $str);

$str = preg_replace('/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?:\->)[^\}]+)\}/',"<?php echo \\1;?>", $str);

//数组

$str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es", "self::addquote('<?php echo \\1;?>')", $str);

$str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\|([^{}]*)\}/es", "self::addquote('<?php if(!empty(\\1)){echo \\1;}else{echo \\2;} ?>')", $str);

//常量

$str = preg_replace("/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/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_\-\.\x7f-\xff]+)\]/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;

}

}

3.[代码]使用

public function test(){

include template();

}

4.[代码]模板使用

{if !empty($result)}

{loop $result $r}

{$r['order_sn']}{$r['name']}{$r['mobile']}{:fdate($r['add_time'])}{if $r['status'] == 0}处理中{elseif $r['status'] ==1}已处理{else}无效{/if}

{/loop}

{else}

您还没有收到任何预约

{/if}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值