• 全国400电话网上服务平台
    强大号码库资源任选,方便,快捷,快速开通。
    咨询热线:400-1100-266  

    dedecms模板原理,实现标签替换
    POST TIME:2017-11-13 00:35

    正则匹配出所有的arclist标签并构造SQL

    取出数据并替换field为相应字段的数据

    为field标签添加一个function属性

    <?php
    require_once(dirname(__FILE__)."/../include/common.inc.php");
    //1.读入模板文件
    $str=file_get_contents('test.html');
    //2.使用正则匹配出页面中所有的arclist标签
    $re='/{dede:arclist(.*)}(.*){\/dede:arclist}/Us';
    //执行正则匹配
    //第一个参数:正则
    //第二个参数:字符串
    //第三个参数:这个函数会把匹配到的结果放第三个参数的数组中
    //返回值:匹配到的个数
    preg_match_all($re,$str,$a);
    //3.循环每一个匹配到的arclist标签进行处理
    foreach($a[0]as$k=>$v)
    {
    /****************处理标签1.根据标签上的属性构造一个SQL语句**************/
    //取出标签相应的属性字符串并把属性转化成一个数组,如row="10"channelid="17"addfields="pffz,pfrs,yuyan"orderby="id"orderway="desc"
    $attrArr=strToArray($a[1][$k]);
    //根据构造构造SQL语句上的变量
    if(isset($attrArr['row']))
    $limit=$attrArr['row'];
    else
    $limit=20;
    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_addon17bONa.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[2][$k];
    /**
    <li>
    <imgsrc="[field:litpic/]"/><br/>
    标题:[field:title/]<br/>
    评分分值:[field:pffzfunction="getSmallStar(@me)"/]<br/>
    评分人数:[field:pfrs/]<br/>
    语言:[field:yuyan/]
    </li>
    **/
    //把字符串中的[field:xxxx/]替换成$row['xxxx']变量。
    $_re='/\[field:(\w+)(\s+function=("|\&;)(\w+)\((.*)\)\3)?\/\]/U';
    preg_match_all($_re,$_tep,$_a);
    /**
    array
    0=>
    array
    0=>string'[field:litpic/]'(length=15)
    1=>string'[field:title/]'(length=14)
    2=>string'[field:pffz/]'(length=13)
    3=>string'[field:pfrs/]'(length=13)
    4=>string'[field:yuyan/]'(length=14)
    1=>
    array
    0=>string'litpic'(length=6)
    1=>string'title'(length=5)
    2=>string'pffz'(length=4)
    3=>string'pfrs'(length=4)
    4=>string'yuyan'(length=5)
    */
    //再循环每一条记录中的每个字段的值
    foreach($_a[0]as$_k=>$_v)
    {
    if($_a[4][$_k]=='')
    //把[field:xxx/]字符串替换成相应的$row[xxx]变量
    $_tep=str_replace($_v,$row[$_a[1][$_k]],$_tep);
    else
    {
    //如果参数中有@me就把@me替换成当前这个字段的数据库中的值
    $_a[5][$_k]=str_replace('@me',$row[$_a[1][$_k]],$_a[5][$_k]);
    //如果有函数就调用函数
    $funStr='$_val='.$_a[4][$_k]."({$_a[5][$_k]});";
    eval($funStr);
    $_tep=str_replace($_v,$_val,$_tep);
    }
    }
    $html.=$_tep;
    }
    //到这arclist标签就已经都解析成了相应的数据,把整个arclist标签替换成解析之后的数据,$html就是
    arclist最终解析完成之后的HTML的字符串
    $str=str_replace($v,$html,$str);
    //一个arclist就解析完成了
    }
    //把解析好的字符串生成前台静态页
    file_put_contents('./index.html',$str);
    echo'解析成功!';
    functionstrToArray($str)
    {
    $str=trim($str);
    //从属性字符串中匹配出每个属性,格式如:row="10"channelid="17"addfields="pffz,pfrs,yuyan"orderby="id"orderway="desc"
    $re='/[a-z]+\s*=\s*("|\&;).*\1/U';
    $data=array();
    preg_match_all($re,$str,$a);
    foreach($a[0]as$k=>$v)
    {
    $_a=explode('=',$v);
    //去掉属性值左右的引号,属性左右的引号是单引号还是双引号不能确定所以需要使用$a[1][$k]变量来代替,这个变量是正则中
    的第一个括号的内容,匹配的就是引号
    $_a[1]=ltrim($_a[1],$a[1][$k]);
    $_a[1]=rtrim($_a[1],$a[1][$k]);
    $data[$_a[0]]=$_a[1];
    }
    return$data;

    }
    
    Copyright © 2003-2016
    时间:9:00-21:00 (节假日不休)
    版权所有:巨人网络(扬州)科技有限公司
    总部地址:江苏省信息产业基地11号楼四层
    《增值电信业务经营许可证》 苏B2-20120278
    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信

    微信号已复制,请打开微信添加咨询详情!