找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 136|回复: 0

[cms教程] dedecms模板原理,实现标签替换

[复制链接]

该用户从未签到

发表于 2020-9-24 10:45:26 | 显示全部楼层 |阅读模式

您需要 登录 才可以下载或查看,没有账号?立即注册

×
文章介绍
         
         
       
        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,;
                /**
                [*,
                   
[img][/img]

                     标题:[field:title/,

                     评分分值:[field:pffz    function="getSmallStar(@me)"/,

                     评分人数:[field:pfrs/,

                     语言:[field:yuyan/,
                
            **/
                // 把字符串中的[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;
         
         
        }
         
         
         
         
       
        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,;
                /**
                [*,
                   
[img][/img]

                     标题:[field:title/,

                     评分分值:[field:pffz    function="getSmallStar(@me)"/,

                     评分人数:[field:pfrs/,

                     语言:[field:yuyan/,
                
            **/
                // 把字符串中的[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;
         
         
        }
         
         
       
        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,;
                /**
                [*,
                   
[img][/img]

                     标题:[field:title/,

                     评分分值:[field:pffz    function="getSmallStar(@me)"/,

                     评分人数:[field:pfrs/,

                     语言:[field:yuyan/,
                
            **/
                // 把字符串中的[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;
         
         
        }
回复

使用道具 举报

网站地图|页面地图|文字地图|Archiver|手机版|小黑屋|找资源 |网站地图

GMT+8, 2024-10-8 08:33

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表