最新公告
  • 欢迎您光临站壳网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • dedecms模板原理,实现标签替换

    文章介绍
     
     
    <?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 = ' LEFT JOIN dede_addon17 b ON a.id=b.aid ';
        else
            $leftJoin = '';
        if(isset($attrArr['addfields']))
            $extraFields = ','.$attrArr['addfields'];
        else
            $extraFields = '';
        // 解析属性
        
        $sql = "SELECT a.*$extraFields
                FROM dede_archives a $leftJoin
                 ORDER BY $orderby $orderway
                 LIMIT $limit";
        $dsql->Execute('me', $sql);
        $html = '';
        // 每个arclist对应的多个数据
        while($row = $dsql->GetArray('me'))
        {
            // 重置模板字符串,不要在原模板上面进行替换
            $_tep = $a[2][$k];
            /**
            <li>
                <img src="[field:litpic/]" /><br />
                 标题:[field:title/]<br />
                 评分分值:[field:pffz    function="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 '解析成功!';
     
     
     
     
    function strToArray($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;
     
     
    }
     
     
     
     
    <?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 = ' LEFT JOIN dede_addon17 b ON a.id=b.aid ';
        else
            $leftJoin = '';
        if(isset($attrArr['addfields']))
            $extraFields = ','.$attrArr['addfields'];
        else
            $extraFields = '';
        // 解析属性
        
        $sql = "SELECT a.*$extraFields
                FROM dede_archives a $leftJoin
                 ORDER BY $orderby $orderway
                 LIMIT $limit";
        $dsql->Execute('me', $sql);
        $html = '';
        // 每个arclist对应的多个数据
        while($row = $dsql->GetArray('me'))
        {
            // 重置模板字符串,不要在原模板上面进行替换
            $_tep = $a[2][$k];
            /**
            <li>
                <img src="[field:litpic/]" /><br />
                 标题:[field:title/]<br />
                 评分分值:[field:pffz    function="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 '解析成功!';
     
     
     
     
    function strToArray($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;
     
     
    }
     
     
    <?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 = ' LEFT JOIN dede_addon17 b ON a.id=b.aid ';
        else
            $leftJoin = '';
        if(isset($attrArr['addfields']))
            $extraFields = ','.$attrArr['addfields'];
        else
            $extraFields = '';
        // 解析属性
        
        $sql = "SELECT a.*$extraFields
                FROM dede_archives a $leftJoin
                 ORDER BY $orderby $orderway
                 LIMIT $limit";
        $dsql->Execute('me', $sql);
        $html = '';
        // 每个arclist对应的多个数据
        while($row = $dsql->GetArray('me'))
        {
            // 重置模板字符串,不要在原模板上面进行替换
            $_tep = $a[2][$k];
            /**
            <li>
                <img src="[field:litpic/]" /><br />
                 标题:[field:title/]<br />
                 评分分值:[field:pffz    function="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 '解析成功!';
     
     
     
     
    function strToArray($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;
     
     
    }
     

    以上就是dedecms模板原理,实现标签替换的介绍,希望大家喜欢!

    更多教程关注FF推源码网。

    • 40712会员总数(位)
    • 5450资源总数(个)
    • 94本周发布(个)
    • 19 今日发布(个)
    • 1727稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情