#简介
- 视图模版替换
- 支持变量,for循环,foreach循环,if判断,if else判断
#调用
- index.php
<?php use ppt\tool\View; $haha = 12; $id = 111; $arr = ['x','y',3]; $pp = [ 'x'=>['id'=>'1','name'=>'12'], 'y'=>['id'=>'1','name'=>'12'], 'z'=>['id'=>'1','name'=>'12'], ]; echo View::display('',['haha'=>$haha,'id'=>$id,'arr'=>$arr,'pp'=>$pp,]); echo '123456';
- index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {if($id===1)} 1 {/if} {else if($id===2)} 2 {/else if} {else} other {/else} {foreach($arr as $item)} {$item} {/foreach} </body> </html>
输出tmp.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<?php if(($id===1)){ ?>
1
<?php } else if($id===2){ ?>
2
<?php } else { ?>
other
<?php } foreach($arr as $item){ echo $item; } ?>
</body>
</html>
#代码View.php
<?php
namespace ppt\tool;
class View
{
private static $tpl_path = app . '/html/';
private static $ext = '.html';
public static function display($_tpl = '', $_param = [])
{
if (!empty($_param)) {
foreach ($_param as $_key => $_v) {
$$_key = $_v;
}
}
if (empty($_tpl)) {
$_pff = '';
if (!empty(debug_backtrace()[1]['function']))
$_pff = debug_backtrace()[1]['function'];
$_pf = debug_backtrace()[0]['file'];
$_pf = str_replace('\\', '/', $_pf);
$_pf = str_replace([app . '/code', '.php'], '', $_pf);
$_tpl = strtolower($_pf);
}
$_file1 = self::$tpl_path . $_tpl . self::$ext;
$_file2 = self::$tpl_path . 'tmp' . self::$ext;
if (!is_file($_file1)) {
$_msg = 'error: 文件' . __FILE__ . ' 第' . __LINE__ . '行 函数' . __FUNCTION__ . ' file【' . $_file1 . '】不存在';
echo $_msg;
exit();
}
$_html = file_get_contents($_file1);
$_content = self::biuBiu($_html);
file_put_contents($_file2, $_content);
ob_start();
require_once $_file2;
$_res = ob_get_clean();
unlink($_file2);
return $_res;
}
public static function biuBiu($tpl)
{
$content = self::fanyiIf($tpl);
$content = self::fanyiElse($content);
$content = self::fanyiXunhuan($content);
$content = self::fanyiBianliang($content);
$content = self::biaoqianQuchon($content);
return $content;
}
private static function biaoqianQuchon($tpl)
{
$pattern = "/[\s]*\?\>[\s]*\<\?php /U";
preg_match_all($pattern, $tpl, $res);
if (!empty($res)) {
foreach ($res[0] as $item) {
$tpl = str_replace($item, ' ', $tpl);
}
}
return $tpl;
}
private static function fanyi($tpl,$preg,$replace_preg,$replace_arr)
{
preg_match_all($preg, $tpl, $res);
if (!empty($res)) {
$res_p = $res[0];
foreach ($replace_preg as $pk=>$pv){
$res_p = preg_replace($pk,$pv,$res_p);
}
foreach ($replace_arr as $ak=>$av){
$res_p = str_replace($ak,$av,$res_p);
}
foreach ($res[0] as $key => $item) {
$tpl = str_replace($item, $res_p[$key], $tpl);
}
}
return $tpl;
}
private static function fanyiElse($tpl)
{
$tpl = self::fanyiElse_head($tpl);
$tpl = self::fanyiElse_end($tpl);
return $tpl;
}
private static function fanyiElse_head($tpl)
{
return self::fanyi($tpl,'/\{[\s]*else[\s\S]*[\s]*\}/U',['/[\s]+/'=>'', '/\{else/U'=>'<?php else ', '/\}/U'=>'{ ?>'],[]);
}
private static function fanyiElse_end($tpl)
{
return self::fanyi($tpl,'/\{[\s]*\/[\s]*else[\s\S]*[\s]*\}/U',['/[\s]+/'=>'', '/{\/else[\s\S]*\}/U'=>'<?php } ?>',],[]);
}
private static function fanyiIf($tpl)
{
$tpl = self::fanyiIf_head($tpl);
$tpl = self::fanyiIf_end($tpl);
return $tpl;
}
private static function fanyiIf_head($tpl)
{
return self::fanyi($tpl,'/\{[\s]*if[\s\S]*[\s]*\}/U',['/[\s]+/'=>'',],['{if'=>'<?php if(', '}'=>'){ ?>',]);
}
private static function fanyiIf_end($tpl)
{
return self::fanyi($tpl,'/\{[\s]*\/[\s]*if[\s]*\}/',['/[\s]+/'=>'',],['{/if}'=>'<?php } ?>',]);
}
private static function fanyiBianliang($tpl)
{
return self::fanyi($tpl,'/\{[\s]*\$[\S]+[\s]*\}/U',['/[\s]+/'=>'',],['{'=>'<?php echo ', '}'=>'; ?>',]);
}
private static function fanyiXunhuan($tpl)
{
$tpl = self::fanyiXunhuan_head($tpl);
$tpl = self::fanyiXunhuan_end($tpl);
return $tpl;
}
private static function fanyiXunhuan_head($tpl)
{
return self::fanyi($tpl,'/\{[\s]*for[\s\S]*[\s]*\}/U',['/[\s]+/'=>' ', '/\{[\s]+/U'=>'{', '/[\s]+\}/U'=>'}',],['{for'=>'<?php for', '}'=>'{ ?>',]);
}
private static function fanyiXunhuan_end($tpl)
{
return self::fanyi($tpl,'/\{[\s]*\/[\s]*for[\s\S]*[\s]*\}/U',['/[\s]+/'=>'', '/\{\/for[\s\S]*\}/'=>'<?php } ?>',],[]);
}
}
#终结
- 简单几十枚