这个类基本上就是实现了将PHP的二维数组 一维数组 和单个值 在模板中做了替换 实现了一个简单的模板解析功能 不要小看它,功能可不弱哦,速度也是很给力的
将PHP源码和模板文件复制到自己的测试机器侠运行就知道怎么使用了
php源码和例子如下:
<?php
class StaticFile {
public $tplName;
public $tplData;
public $staticData;
public $realData;
public $data;
public function __construct()
{
}
public function setTplName($tplName)
{
if (!file_exists($tplName)) {
return false;
}
$this->tplName = $tplName;
if (!$this->getTplData()) {
return false;
}
return true;
}
public function getTplData()
{
$tplData = @file_get_contents($this->tplName);
if (empty($tplData)) {
return false;
}
$this->tplData = $tplData;
$this->staticData = $tplData;
return true;
}
public function formatRealData()
{
foreach($this->realData as $k => $v) {
if (!is_array($v)) {
$this->data['string'][$k] = $v;
} else {
$this->data['array'][$k] = $v;
}
}
foreach($this->data['string'] as $k => $v) {
if (is_numeric($k)) {
$this->data['string_num'][$k] = $v;
} else {
$this->data['string_assoc'][$k] = $v;
}
}
unset($this->data['string']);
foreach($this->data['array'] as $k => $v) {
foreach($v as $k1 => $v1) {
if (!is_array($v1)) {
$this->data['yiwei'][$k] = $this->data['array'][$k];
break;
} else {
$this->data['erwei'][$k] = $this->data['array'][$k];
break;
}
}
}
unset($this->data['array']);
foreach($this->data['yiwei'] as $k => $v) {
foreach($v as $k1 => $v1 ) {
if (is_numeric($k1)) {
$this->data['yiwei_num'][$k] = $v;
break;
} else {
$this->data['yiwei_assoc'][$k] = $v;
break;
}
}
}
unset($this->data['yiwei']);
foreach($this->data['erwei'] as $k => $v) {
foreach($v as $k1 => $v1 ) {
if (isset($v1[0])) {
$this->data['erwei_num'][$k] = $v;
break;
} else {
$this->data['erwei_assoc'][$k] = $v;
break;
}
}
}
unset($this->data['erwei']);
}
public function replaceString()
{
$i = 1;
foreach($this->data['string_num'] as $k => $v) {
$this->staticData = str_replace('{#:?'.$i.'#}',$v,$this->staticData);
$i++;
}
foreach($this->data['string_assoc'] as $k => $v) {
$this->staticData = str_replace('{#:'.$k.'#}',$v,$this->staticData);
}
}
public function replaceYiweiAssocArray()
{
foreach($this->data['yiwei_assoc'] as $k => $v) {
$keys = array_keys($v);
foreach($keys as $v1) {
$key = '{#'.$k.':'.$v1.'#}';
$this->staticData = str_replace($key, $v[$v1], $this->staticData);
}
}
}
public function replaceYiweiNumArray()
{
foreach($this->data['yiwei_num'] as $k => $v) {
$values = array_values($v);
$i = 1;
foreach($values as $v1) {
$key = '{#'.$k.':?'.$i.'#}';
$this->staticData = str_replace($key, $v1, $this->staticData);
$i++;
}
}
}
public function processAssoc($value)
{
return "{:{$value}:}";
}
public function processNum($num)
{
$num += 1;
return "{:?{$num}:}";
}
public function replaceErweiNumArray()
{
foreach ($this->data['erwei_num'] as $k => $v) {
$arr = array();
$prtt = '/{\/for\s*?name='.$k.'\/}([\S\s]*?){\/endfor\/}/i';
preg_match_all($prtt, $this->staticData, $arr);
if(!empty($arr[0])) {
foreach($arr[0] as $key => $val) {
$data = array();
foreach($v as $k1 => $v1) {
$values = array_values($v1);
$keys = array_map('self::processNum', array_keys($values));
$data[] = trim(str_replace($keys, $values, $arr[1][$key]));
}
$str = join('', $data);
$this->staticData = str_replace($arr[0][$key], $str, $this->staticData);
}
}
}
}
public function replaceErweiAssocArray()
{
foreach ($this->data['erwei_assoc'] as $k => $v) {
$arr = array();
$prtt = '/{\/for\s*?name='.$k.'\/}([\S\s]*?){\/endfor\/}/i';
preg_match_all($prtt, $this->staticData, $arr);
if(!empty($arr[0])) {
foreach ($arr[0] as $key => $val) {
$data = array();
foreach ($v as $k1 => $v1) {
$values = array_values($v1);
$keys = array_map('self::processAssoc', array_keys($v1));
$data[] = trim(str_replace($keys, $values, $arr[1][$key]));
}
$str = join('', $data);
$this->staticData = str_replace($arr[0][$key], $str, $this->staticData);
}
}
}
}
public function FilteIllegal()
{
$this->staticData = preg_replace('/{#:\?\d*?#}/', '', $this->staticData);//字符串过滤非法索引
$this->staticData = preg_replace('/{#:\w*?#}/i', '', $this->staticData);//字符串过滤非法键
$this->staticData = preg_replace('/{#\w*:\w*?#}/i', '', $this->staticData);//一维数组过滤非法键
$this->staticData = preg_replace('/{#\w*:\?\d*?#}/i', '', $this->staticData);//一维数组过滤非法索引
$this->staticData = preg_replace('/{:[\s\S]*?:}/', '', $this->staticData);//二维数组过滤非法键和索引
}
public function assign($array)
{
$this->realData = $array;
$this->formatRealData();
}
public function createStaticData($show = 0)
{
$this->replaceString();//字符串处理
$this->replaceYiweiAssocArray();//带关联键的一维数组处理
$this->replaceYiweiNumArray();//带索引键的一维数组处理
$this->replaceErweiAssocArray();//带关联键的二维数组处理
$this->replaceErweiNumArray();//带索引键的二维数组处理
if (!$show) {//$show参数为真将显示未必配成功的模版语法
$this->FilteIllegal();//过滤掉错误的匹配字符
}
return $this->staticData;
}
}
//demo 创建静态数据
header('Content-type:text/html;charset=utf8');
$tplName = dirname(__FILE__) . '/test.html'; //定义模版路径
$sf = new StaticFile();//实例化静态文件类
$sf->setTplName($tplName);//设置模版路径
//定义一批数据
$realData1 = array('张三','25','高中','计算机');
$realData2 = array('name'=>'李四','age'=>'25','xueli'=>'大学');
$realData3 = array(
array('name'=>'李四','age'=>'26'),
array('name'=>'王无','age'=>'27'),
array('name'=>'DDD','age'=>'DD'),
array('name'=>'王FDS无','age'=>'2FD7'),
array('name'=>'王无','age'=>'27'),
array('name'=>'王无','age'=>'27'),
array('name'=>'王无','age'=>'27'),
);
$realData4 = array(
array('name'=>'aaa','age'=>'2ddd'),
array('name'=>'bbb','age'=>'2ddd'),
array('name'=>'ccc','age'=>'DDede'),
array('name'=>'王FDS无','age'=>'2FdfsafasD7'),
array('name'=>'王无','age'=>'fds'),
array('name'=>'王无','age'=>'27fda'),
array('name'=>'王无','age'=>'2fds7'),
);
$realData5 = array(
array('aaa','26'),
array('bbb','27'),
);
//分配数据
$sf->assign(array(
'a' => $realData1, //分配一维数组 指定一个名称 该数组是枚举数组
'b' => $realData2, //分配一维数组 指定一个名称 该数组是关联数组
'list1' => $realData3,//分配二维数组 指定一个名称 该数组是关联数组
'list2' => $realData4,//分配二维数组 指定一个名称 该数组是关联数组
'list3' => $realData5,//分配二维数组 指定一个名称 该数组是枚举数组
'num' =>100,//分配一个值 他的调用名字为num
'200',//分配一个值 他的调用名字为?1
'300',//分配一个值 他的调用名字为?2
'400',//分配一个值 他的调用名字为?3
'500',//分配一个值 他的调用名字为?4
'600',//分配一个值 他的调用名字为?5
));
//创建静态数据
$staticData = $sf->createStaticData(0);
//输出查看结果
echo $staticData;
//将数据写入静态文件,定义静态文件路径规则 然后写入...
//file_put_contents($fileName,$staticData); $fileName = 绝对文件路径
//多条数据 进行 多次调用$this->assign()方法分配数据再次执行createStaticData即可
模板代码如下:
<!DOCTYPE html>
<html>
<head>
<title>demo</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>
你好 我是{#b:name#} 我的年龄是{#b:age#} 这是一维关联数组展示 学历{#b:xueli#} {#b:zhuanye#}<br />
你好我是{#a:?1#} 我的年龄是{#a:?2#} 这是一维枚举数组展示 学历{#a:?3#} {#a:?44#}<br />
这是一个数字 他的值是{#:num#} {#:numsd#}这种写法他的k不是索引类型<br />
这是一个数字 他的值是{#:?1#} {#:?2#} {#:?3#} {#:?4#}{:name:}这种写法他的k是索引类型 <br />
</div>
<div>
<ul>
{/for name=list1/}
<li>
姓名{:name:} 年龄{:age:} {:adfsd:}
</li>
{/endfor/}
</ul>
<ul>
{/for name=list2/}
<li>姓名{:age:} 年龄{:age:}</li>
{/endfor/}
</ul>
<ul>
{/for name=list3/}
<li>姓名{:?1:} 年龄{:?2:}</li>
{/endfor/}
</ul>
</div>
</body>
</html>
上面的数据运行后的结果是
--------------------------
- 昵称:子海蓝心
- QQ:51153627
- 职业:PHP开发工程师
--------------------------