dedecms模板原理,实现标签替换
require_once(dirname(_FILE_)."/../include/common.inc.php");
//I..读入模板文件
$str=file_get_contents(test.html);
//
更多精彩就在: 51免费论文网|www.jxszl.com
II.使用正则匹配出页面中所有的arclist标签
$re=/{dede:arclist(.*)}(.*){/dede:arclist}/Us;
//执行正则匹配
//第I.个参数:正则
//第II个参数:字符串
//第III个参数:这个函数会把匹配到的结果放第III个参数的数组中
//返回值:匹配到的个数
preg_match_all($re,$str,$a);
//III.循环每I.个匹配到的arclist标签进行处理
foreach($a[0]as$k=>$v)
{
/****************处理标签I..根据标签上的属性构造I.个SQL语句**************/
//取出标签相应的属性字符串并把属性转化成I.个数组,如row="I.0"channelid="I.VII"addfields="pffz,pfrs,yuyan"orderby="id"orderway="desc"
$attrArr=strToArray($a[I.][$k]);
//根据构造构造SQL语句上的变量
if(isset($attrArr[row]))
$limit=$attrArr[row];
else
$limit=II0;
if(isset($attrArr[orderby]))
$orderby=$attrArr[orderby];
else
$orderby=id;
if(isset($attrArr[orderway]))
$orderway=$attrArr[orderway];
else
$orderway=desc;
//连表的属性
if(isset($attrArr[channelid]))
$leftJoin=LEFTJOINdede_addonI.VIIbONa.id=b.aid;
else
$leftJoin=;
if(isset($attrArr[addfields]))
$extraFields=,.$attrArr[addfields];
else
$extraFields=;
//解析属性
$sql="SELECTa.*$extraFields
FROMdede_archivesa$leftJoin
ORDERBY$orderby$orderway
LIMIT$limit";
$dsql->Execute(me,$sql);
$html=;
//每个arclist对应的多个数据
while($row=$dsql->GetArray(me))
{
//重置模板字符串,不要在原模板上面进行替换
$_tep=$a[II][$k];
/**
标题:[field:title/]
评分分值:[field:pffzfunction="getSmallStar(@me)"/]
评分人数:[field:pfrs/]
语言:[field:yuyan/]
**/
//把字符串中的[field:xxxx/]替换成$row[xxxx]变量.
$_re=/[field:(w+)(s+function=("|)(w+)((.*))III)?/]/U;
preg_match_all($_re,$_tep,$_a);
/**
array
0=>
array
0=>string[field:litpic/](length=I.V)
I.=>string[field:title/](length=I.IV)
II=>string[field:pffz/](length=I.III)
III=>string[field:pfrs/](length=I.III)
IV=>string[field:yuyan/](length=I.IV)
I.=>
array
0=>stringlitpic(length=VI)
I.=>stringtitle(length=V)
II=>stringpffz(length=IV)
III=>stringpfrs(length=IV)
IV=>stringyuyan(length=V)
*/
//再循环每I.条记录中的每个字段的值
foreach($_a[0]as$_k=>$_v)
{
if($_a[IV][$_k]==)
//把[field:xxx/]字符串替换成相应的$row[xxx]变量
$_tep=str_replace($_v,$row[$_a[I.][$_k]],$_tep);
else
{
//如果参数中有@me就把@me替换成当前这个字段的数据库中的值
$_a[V][$_k]=str_replace(@me,$row[$_a[I.][$_k]],$_a[V][$_k]);
//如果有函数就调用函数
$funStr=$_val=.$_a[IV][$_k]."({$_a[V][$_k]});";
eval($funStr);
$_tep=str_replace($_v,$_val,$_tep);
}
}
$html.=$_tep;
}
//到这arclist标签就已经都解析成了相应的数据,把整个arclist标签替换成解析之后的数据,$html就是
arclist最终解析完成之后的HTML的字符串
$str=str_replace($v,$html,$str);
//I.个arclist就解析完成了
}
//把解析好的字符串生成前台静态页
file_put_contents(./index.html,$str);
echo解析成功!;
functionstrToArray($str)
{
$str=trim($str);
//从属性字符串中匹配出每个属性,格式如:row="I.0"channelid="I.VII"addfields="pffz,pfrs,yuyan"orderby="id"orderway="desc"
$re=/[a-z]+s*=s*("|).*I./U;
$data=array();
preg_match_all($re,$str,$a);
foreach($a[0]as$k=>$v)
{
$_a=explode(=,$v);
//去掉属性值左右的引号,属性左右的引号是单引号还是双引号不能确定所以需要使用$a[I.][$k]变量来代替,这个变量是正则中
的第I.个括号的内容,匹配的就是引号
$_a[I.]=ltrim($_a[I.],$a[I.][$k]);
$_a[I.]=rtrim($_a[I.],$a[I.][$k]);
$data[$_a[0]]=$_a[I.];
}
return$data;
}
require_once(dirname(_FILE_)."/../include/common.inc.php");
//I..读入模板文件
$str=file_get_contents(test.html);
//II.使用正则匹配出页面中所有的arclist标签
$re=/{dede:arclist(.*)}(.*){/dede:arclist}/Us;
//执行正则匹配
//第I.个参数:正则
//第II个参数:字符串
//第III个参数:这个函数会把匹配到的结果放第III个参数的数组中
//返回值:匹配到的个数
preg_match_all($re,$str,$a);
//III.循环每I.个匹配到的arclist标签进行处理
foreach($a[0]as$k=>$v)
{
/****************处理标签I..根据标签上的属性构造I.个SQL语句**************/
//取出标签相应的属性字符串并把属性转化成I.个数组,如row="I.0"channelid="I.VII"addfields="pffz,pfrs,yuyan"orderby="id"orderway="desc"
$attrArr=strToArray($a[I.][$k]);
//根据构造构造SQL语句上的变量
if(isset($attrArr[row]))
$limit=$attrArr[row];
else
$limit=II0;
if(isset($attrArr[orderby]))
$orderby=$attrArr[orderby];
else
$orderby=id;
if(isset($attrArr[orderway]))
$orderway=$attrArr[orderway];
else
$orderway=desc;
//连表的属性
if(isset($attrArr[channelid]))
$leftJoin=LEFTJOINdede_addonI.VIIbONa.id=b.aid;
else
$leftJoin=;
if(isset($attrArr[addfields]))
$extraFields=,.$attrArr[addfields];
else
$extraFields=;
//解析属性
$sql="SELECTa.*$extraFields
FROMdede_archivesa$leftJoin
ORDERBY$orderby$orderway
LIMIT$limit";
$dsql->Execute(me,$sql);
$html=;
//每个arclist对应的多个数据
while($row=$dsql->GetArray(me))
{
//重置模板字符串,不要在原模板上面进行替换
$_tep=$a[II][$k];
/**
标题:[field:title/]
评分分值:[field:pffzfunction="getSmallStar(@me)"/]
评分人数:[field:pfrs/]
语言:[field:yuyan/]
**/
//把字符串中的[field:xxxx/]替换成$row[xxxx]变量.
$_re=/[field:(w+)(s+function=("|)(w+)((.*))III)?/]/U;
preg_match_all($_re,$_tep,$_a);
/**
array
0=>
array
0=>string[field:litpic/](length=I.V)
I.=>string[field:title/](length=I.IV)
II=>string[field:pffz/](length=I.III)
III=>string[field:pfrs/](length=I.III)
IV=>string[field:yuyan/](length=I.IV)
I.=>
array
0=>stringlitpic(length=VI)
I.=>stringtitle(length=V)
II=>stringpffz(length=IV)
III=>stringpfrs(length=IV)
IV=>stringyuyan(length=V)
*/
//再循环每I.条记录中的每个字段的值
foreach($_a[0]as$_k=>$_v)
{
if($_a[IV][$_k]==)
//把[field:xxx/]字符串替换成相应的$row[xxx]变量
$_tep=str_replace($_v,$row[$_a[I.][$_k]],$_tep);
else
{
//如果参数中有@me就把@me替换成当前这个字段的数据库中的值
$_a[V][$_k]=str_replace(@me,$row[$_a[I.][$_k]],$_a[V][$_k]);
//如果有函数就调用函数
$funStr=$_val=.$_a[IV][$_k]."({$_a[V][$_k]});";
eval($funStr);
$_tep=str_replace($_v,$_val,$_tep);
}
}
$html.=$_tep;
}
//到这arclist标签就已经都解析成了相应的数据,把整个arclist标签替换成解析之后的数据,$html就是
arclist最终解析完成之后的HTML的字符串
$str=str_replace($v,$html,$str);
//I.个arclist就解析完成了
}
//把解析好的字符串生成前台静态页
file_put_contents(./index.html,$str);
echo解析成功!;
functionstrToArray($str)
{
$str=trim($str);
//从属性字符串中匹配出每个属性,格式如:row="I.0"channelid="I.VII"addfields="pffz,pfrs,yuyan"orderby="id"orderway="desc"
$re=/[a-z]+s*=s*("|).*I./U;
$data=array();
preg_match_all($re,$str,$a);
foreach($a[0]as$k=>$v)
{
$_a=explode(=,$v);
//去掉属性值左右的引号,属性左右的引号是单引号还是双引号不能确定所以需要使用$a[I.][$k]变量来代替,这个变量是正则中
的第I.个括号的内容,匹配的就是引号
$_a[I.]=ltrim($_a[I.],$a[I.][$k]);
$_a[I.]=rtrim($_a[I.],$a[I.][$k]);
$data[$_a[0]]=$_a[I.];
}
return$data;
}
require_once(dirname(_FILE_)."/../include/common.inc.php");
//I..读入模板文件
$str=file_get_contents(test.html);
//II.使用正则匹配出页面中所有的arclist标签
$re=/{dede:arclist(.*)}(.*){/dede:arclist}/Us;
//执行正则匹配
//第I.个参数:正则
//第II个参数:字符串
//第III个参数:这个函数会把匹配到的结果放第III个参数的数组中
//返回值:匹配到的个数
preg_match_all($re,$str,$a);
//III.循环每I.个匹配到的arclist标签进行处理
foreach($a[0]as$k=>$v)
{
/****************处理标签I..根据标签上的属性构造I.个SQL语句**************/
//取出标签相应的属性字符串并把属性转化成I.个数组,如row="I.0"channelid="I.VII"addfields="pffz,pfrs,yuyan"orderby="id"orderway="desc"
$attrArr=strToArray($a[I.][$k]);
//根据构造构造SQL语句上的变量
if(isset($attrArr[row]))
$limit=$attrArr[row];
else
$limit=II0;
if(isset($attrArr[orderby]))
$orderby=$attrArr[orderby];
else
$orderby=id;
if(isset($attrArr[orderway]))
$orderway=$attrArr[orderway];
else
$orderway=desc;
//连表的属性
if(isset($attrArr[channelid]))
$leftJoin=LEFTJOINdede_addonI.VIIbONa.id=b.aid;
else
$leftJoin=;
if(isset($attrArr[addfields]))
$extraFields=,.$attrArr[addfields];
else
$extraFields=;
//解析属性
$sql="SELECTa.*$extraFields
FROMdede_archivesa$leftJoin
ORDERBY$orderby$orderway
LIMIT$limit";
$dsql->Execute(me,$sql);
$html=;
//每个arclist对应的多个数据
while($row=$dsql->GetArray(me))
{
//重置模板字符串,不要在原模板上面进行替换
$_tep=$a[II][$k];
/**
标题:[field:title/]
评分分值:[field:pffzfunction="getSmallStar(@me)"/]
评分人数:[field:pfrs/]
语言:[field:yuyan/]
**/
//把字符串中的[field:xxxx/]替换成$row[xxxx]变量.
$_re=/[field:(w+)(s+function=("|)(w+)((.*))III)?/]/U;
preg_match_all($_re,$_tep,$_a);
/**
array
0=>
array
0=>string[field:litpic/](length=I.V)
I.=>string[field:title/](length=I.IV)
II=>string[field:pffz/](length=I.III)
III=>string[field:pfrs/](length=I.III)
IV=>string[field:yuyan/](length=I.IV)
I.=>
array
0=>stringlitpic(length=VI)
I.=>stringtitle(length=V)
II=>stringpffz(length=IV)
III=>stringpfrs(length=IV)
IV=>stringyuyan(length=V)
*/
//再循环每I.条记录中的每个字段的值
foreach($_a[0]as$_k=>$_v)
{
if($_a[IV][$_k]==)
//把[field:xxx/]字符串替换成相应的$row[xxx]变量
$_tep=str_replace($_v,$row[$_a[I.][$_k]],$_tep);
else
{
//如果参数中有@me就把@me替换成当前这个字段的数据库中的值
$_a[V][$_k]=str_replace(@me,$row[$_a[I.][$_k]],$_a[V][$_k]);
//如果有函数就调用函数
$funStr=$_val=.$_a[IV][$_k]."({$_a[V][$_k]});";
eval($funStr);
$_tep=str_replace($_v,$_val,$_tep);
}
}
$html.=$_tep;
}
//到这arclist标签就已经都解析成了相应的数据,把整个arclist标签替换成解析之后的数据,$html就是
arclist最终解析完成之后的HTML的字符串
$str=str_replace($v,$html,$str);
//I.个arclist就解析完成了
}
//把解析好的字符串生成前台静态页
file_put_contents(./index.html,$str);
echo解析成功!;
functionstrToArray($str)
{
$str=trim($str);
//从属性字符串中匹配出每个属性,格式如:row="I.0"channelid="I.VII"addfields="pffz,pfrs,yuyan"orderby="id"orderway="desc"
$re=/[a-z]+s*=s*("|).*I./U;
$data=array();
preg_match_all($re,$str,$a);
foreach($a[0]as$k=>$v)
{
$_a=explode(=,$v);
//去掉属性值左右的引号,属性左右的引号是单引号还是双引号不能确定所以需要使用$a[I.][$k]变量来代替,这个变量是正则中
的第I.个括号的内容,匹配的就是引号
$_a[I.]=ltrim($_a[I.],$a[I.][$k]);
$_a[I.]=rtrim($_a[I.],$a[I.][$k]);
$data[$_a[0]]=$_a[I.];
}
return$data;
}
原文链接:http://www.jxszl.com/biancheng/dedecms/73736.html