AB模板网:专注于dede模板,织梦源码,织梦模板,网站模板下载,dedecms模板,网站源码,dedecms教程以及各类手机网站模板和企业网站模板分享.

织梦模板

网站模板搜索
营销型模板 政府网站模板 自适应模板 标签大全

注册

dedecms模板原理,实现标签替换

网站模板下载 www.adminbuy.cn / 2020-09-24
文章介绍
 
 
<?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;
 
 
}
 
本文由AB模板网整理发布,转载请说明出处:http://www.adminbuy.cn/dedecmsjc/6830.html
本文标签:

有问题可以加入织梦技术QQ群一起交流学习

☉首先声明,只要是我们的vip会员全站所有资源均可以免费下载,不做任何限制(了解更多)

☉本站的源码不会像其它下载站一样植入大量的广告。

☉本站提供的织梦源码,都是做好测试好发布的,均可放心使用。

☉本站提供的织梦源码,均带数据及演示地址。可以在任一源码详情页查看演示地址。

☉为了vip利益的最大化,我们还提供了vip赠品(了解更多

☉如有其他问题,请加网站客服QQ(9490489)进行交流。

相关教程

织梦模板_随机Tags

电气设备网站模板 纸业网站模板 通用企业网站模板 化学用品网站模板 家居网站模板 钱包网站模板 建筑工程集团网站模板 保姆月嫂网站模板 消防器材网站模板 网络工作室网站模板 学院学校网站模板 招生类网站模板

推荐教程

首页 VIP专区 静态模板 会员中心