雷火电竞-中国电竞赛事及体育赛事平台

歡迎來(lái)到入門教程網(wǎng)!

dedecms

當(dāng)前位置:主頁(yè) > CMS教程 > dedecms >

dedecms模板原理,實(shí)現(xiàn)標(biāo)簽替換

來(lái)源:本站原創(chuàng)|時(shí)間:2021-08-05|欄目:dedecms|點(diǎn)擊:

文章介紹
 
 
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
//1. 讀入模板文件
$str = file_get_contents('test.html');
//2. 使用正則匹配出頁(yè)面中所有的 arclist 標(biāo)簽
$re = '/{dede:arclist(.*)}(.*){\/dede:arclist}/Us';
// 執(zhí)行正則匹配
// 第一個(gè)參數(shù):正則 
// 第二個(gè)參數(shù):字符串
// 第三個(gè)參數(shù):這個(gè)函數(shù)會(huì)把匹配到的結(jié)果放第三個(gè)參數(shù)的數(shù)組中
// 返回值:匹配到的個(gè)數(shù)
preg_match_all($re, $str, $a);
//3. 循環(huán)每一個(gè)匹配到的arclist標(biāo)簽進(jìn)行處理 
foreach ($a[0] as $k => $v)
{
    /****************處理標(biāo)簽1.根據(jù)標(biāo)簽上的屬性構(gòu)造一個(gè)SQL語(yǔ)句 **************/
    // 取出標(biāo)簽相應(yīng)的屬性字符串并把屬性轉(zhuǎn)化成一個(gè)數(shù)組,如 row="10" channelid="17" addfields="pffz,pfrs,yuyan" orderby="id" orderway="desc"
    $attrArr = strToArray($a[1][$k]);
    // 根據(jù)構(gòu)造構(gòu)造SQL語(yǔ)句上的變量
    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 = '';
    // 每個(gè)arclist對(duì)應(yīng)的多個(gè)數(shù)據(jù)
    while($row = $dsql->GetArray('me'))
    {
        // 重置模板字符串,不要在原模板上面進(jìn)行替換
        $_tep = $a[2][$k];
        /**
        <li>
            <img src="[field:litpic/]" /><br />
             標(biāo)題:[field:title/]<br />
             評(píng)分分值:[field:pffz    function="getSmallStar(@me)"/]<br />
             評(píng)分人數(shù):[field:pfrs/]<br />
             語(yǔ)言:[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)
     */
     // 再循環(huán)每一條 記錄中的每個(gè)字段的值
        foreach($_a[0] as $_k => $_v)
        {
            if($_a[4][$_k] == '')
                // 把[field:xxx/]字符串替換成相應(yīng)的$row[xxx]變量
                $_tep = str_replace($_v, $row[$_a[1][$_k]], $_tep);
            else
            {
                // 如果參數(shù)中有@me就把@me替換成當(dāng)前這個(gè)字段的數(shù)據(jù)庫(kù)中的值
                $_a[5][$_k] = str_replace('@me', $row[$_a[1][$_k]], $_a[5][$_k]);
                // 如果有函數(shù)就調(diào)用函數(shù)
                $funStr = '$_val='.$_a[4][$_k]."({$_a[5][$_k]});";
                eval($funStr);
                $_tep = str_replace($_v, $_val, $_tep);
            }
        }
        $html .= $_tep;
    }
    // 到這arclist標(biāo)簽就已經(jīng)都解析成了相應(yīng)的數(shù)據(jù),把整個(gè)arclist標(biāo)簽替換成解析之后的數(shù)據(jù),$html就是
arclist最終解析完成之后的HTML的字符串
    $str = str_replace($v, $html, $str);
    // 一個(gè)arclist就解析完成了
}
// 把解析好的字符串生成前臺(tái)靜態(tài)頁(yè)
file_put_contents('./index.html', $str);
echo '解析成功!';
 
 
 
 
function strToArray($str)
{
    $str = trim($str);
    // 從屬性字符串中匹配出每個(gè)屬性,格式如: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);
        // 去掉屬性值左右的引號(hào),屬性左右的引號(hào)是單引號(hào)還是雙引號(hào)不能確定所以需要使用$a[1][$k]變量來(lái)代替,這個(gè)變量是正則中
的第一個(gè)括號(hào)的內(nèi)容,匹配的就是引號(hào)
        $_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. 使用正則匹配出頁(yè)面中所有的 arclist 標(biāo)簽
$re = '/{dede:arclist(.*)}(.*){\/dede:arclist}/Us';
// 執(zhí)行正則匹配
// 第一個(gè)參數(shù):正則 
// 第二個(gè)參數(shù):字符串
// 第三個(gè)參數(shù):這個(gè)函數(shù)會(huì)把匹配到的結(jié)果放第三個(gè)參數(shù)的數(shù)組中
// 返回值:匹配到的個(gè)數(shù)
preg_match_all($re, $str, $a);
//3. 循環(huán)每一個(gè)匹配到的arclist標(biāo)簽進(jìn)行處理 
foreach ($a[0] as $k => $v)
{
    /****************處理標(biāo)簽1.根據(jù)標(biāo)簽上的屬性構(gòu)造一個(gè)SQL語(yǔ)句 **************/
    // 取出標(biāo)簽相應(yīng)的屬性字符串并把屬性轉(zhuǎn)化成一個(gè)數(shù)組,如 row="10" channelid="17" addfields="pffz,pfrs,yuyan" orderby="id" orderway="desc"
    $attrArr = strToArray($a[1][$k]);
    // 根據(jù)構(gòu)造構(gòu)造SQL語(yǔ)句上的變量
    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 = '';
    // 每個(gè)arclist對(duì)應(yīng)的多個(gè)數(shù)據(jù)
    while($row = $dsql->GetArray('me'))
    {
        // 重置模板字符串,不要在原模板上面進(jìn)行替換
        $_tep = $a[2][$k];
        /**
        <li>
            <img src="[field:litpic/]" /><br />
             標(biāo)題:[field:title/]<br />
             評(píng)分分值:[field:pffz    function="getSmallStar(@me)"/]<br />
             評(píng)分人數(shù):[field:pfrs/]<br />
             語(yǔ)言:[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)
     */
     // 再循環(huán)每一條 記錄中的每個(gè)字段的值
        foreach($_a[0] as $_k => $_v)
        {
            if($_a[4][$_k] == '')
                // 把[field:xxx/]字符串替換成相應(yīng)的$row[xxx]變量
                $_tep = str_replace($_v, $row[$_a[1][$_k]], $_tep);
            else
            {
                // 如果參數(shù)中有@me就把@me替換成當(dāng)前這個(gè)字段的數(shù)據(jù)庫(kù)中的值
                $_a[5][$_k] = str_replace('@me', $row[$_a[1][$_k]], $_a[5][$_k]);
                // 如果有函數(shù)就調(diào)用函數(shù)
                $funStr = '$_val='.$_a[4][$_k]."({$_a[5][$_k]});";
                eval($funStr);
                $_tep = str_replace($_v, $_val, $_tep);
            }
        }
        $html .= $_tep;
    }
    // 到這arclist標(biāo)簽就已經(jīng)都解析成了相應(yīng)的數(shù)據(jù),把整個(gè)arclist標(biāo)簽替換成解析之后的數(shù)據(jù),$html就是
arclist最終解析完成之后的HTML的字符串
    $str = str_replace($v, $html, $str);
    // 一個(gè)arclist就解析完成了
}
// 把解析好的字符串生成前臺(tái)靜態(tài)頁(yè)
file_put_contents('./index.html', $str);
echo '解析成功!';
 
 
 
 
function strToArray($str)
{
    $str = trim($str);
    // 從屬性字符串中匹配出每個(gè)屬性,格式如: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);
        // 去掉屬性值左右的引號(hào),屬性左右的引號(hào)是單引號(hào)還是雙引號(hào)不能確定所以需要使用$a[1][$k]變量來(lái)代替,這個(gè)變量是正則中
的第一個(gè)括號(hào)的內(nèi)容,匹配的就是引號(hào)
        $_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. 使用正則匹配出頁(yè)面中所有的 arclist 標(biāo)簽
$re = '/{dede:arclist(.*)}(.*){\/dede:arclist}/Us';
// 執(zhí)行正則匹配
// 第一個(gè)參數(shù):正則 
// 第二個(gè)參數(shù):字符串
// 第三個(gè)參數(shù):這個(gè)函數(shù)會(huì)把匹配到的結(jié)果放第三個(gè)參數(shù)的數(shù)組中
// 返回值:匹配到的個(gè)數(shù)
preg_match_all($re, $str, $a);
//3. 循環(huán)每一個(gè)匹配到的arclist標(biāo)簽進(jìn)行處理 
foreach ($a[0] as $k => $v)
{
    /****************處理標(biāo)簽1.根據(jù)標(biāo)簽上的屬性構(gòu)造一個(gè)SQL語(yǔ)句 **************/
    // 取出標(biāo)簽相應(yīng)的屬性字符串并把屬性轉(zhuǎn)化成一個(gè)數(shù)組,如 row="10" channelid="17" addfields="pffz,pfrs,yuyan" orderby="id" orderway="desc"
    $attrArr = strToArray($a[1][$k]);
    // 根據(jù)構(gòu)造構(gòu)造SQL語(yǔ)句上的變量
    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 = '';
    // 每個(gè)arclist對(duì)應(yīng)的多個(gè)數(shù)據(jù)
    while($row = $dsql->GetArray('me'))
    {
        // 重置模板字符串,不要在原模板上面進(jìn)行替換
        $_tep = $a[2][$k];
        /**
        <li>
            <img src="[field:litpic/]" /><br />
             標(biāo)題:[field:title/]<br />
             評(píng)分分值:[field:pffz    function="getSmallStar(@me)"/]<br />
             評(píng)分人數(shù):[field:pfrs/]<br />
             語(yǔ)言:[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)
     */
     // 再循環(huán)每一條 記錄中的每個(gè)字段的值
        foreach($_a[0] as $_k => $_v)
        {
            if($_a[4][$_k] == '')
                // 把[field:xxx/]字符串替換成相應(yīng)的$row[xxx]變量
                $_tep = str_replace($_v, $row[$_a[1][$_k]], $_tep);
            else
            {
                // 如果參數(shù)中有@me就把@me替換成當(dāng)前這個(gè)字段的數(shù)據(jù)庫(kù)中的值
                $_a[5][$_k] = str_replace('@me', $row[$_a[1][$_k]], $_a[5][$_k]);
                // 如果有函數(shù)就調(diào)用函數(shù)
                $funStr = '$_val='.$_a[4][$_k]."({$_a[5][$_k]});";
                eval($funStr);
                $_tep = str_replace($_v, $_val, $_tep);
            }
        }
        $html .= $_tep;
    }
    // 到這arclist標(biāo)簽就已經(jīng)都解析成了相應(yīng)的數(shù)據(jù),把整個(gè)arclist標(biāo)簽替換成解析之后的數(shù)據(jù),$html就是
arclist最終解析完成之后的HTML的字符串
    $str = str_replace($v, $html, $str);
    // 一個(gè)arclist就解析完成了
}
// 把解析好的字符串生成前臺(tái)靜態(tài)頁(yè)
file_put_contents('./index.html', $str);
echo '解析成功!';
 
 
 
 
function strToArray($str)
{
    $str = trim($str);
    // 從屬性字符串中匹配出每個(gè)屬性,格式如: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);
        // 去掉屬性值左右的引號(hào),屬性左右的引號(hào)是單引號(hào)還是雙引號(hào)不能確定所以需要使用$a[1][$k]變量來(lái)代替,這個(gè)變量是正則中
的第一個(gè)括號(hào)的內(nèi)容,匹配的就是引號(hào)
        $_a[1] = ltrim($_a[1], $a[1][$k]);
        $_a[1] = rtrim($_a[1], $a[1][$k]);
        $data[$_a[0]] = $_a[1];
    }
    return $data;
 
 
}
 

上一篇:織夢(mèng)cms如何獲取當(dāng)前欄目的上級(jí)欄目?

欄    目:dedecms

下一篇:織夢(mèng)channel子欄目導(dǎo)航標(biāo)簽currentstyle鼠標(biāo)點(diǎn)擊高亮變色加class樣式

本文標(biāo)題:dedecms模板原理,實(shí)現(xiàn)標(biāo)簽替換

本文地址:http://www.jygsgssxh.com/a1/dedecms/14916.html

更多dedecms

您可能感興趣的文章

閱讀排行

本欄相關(guān)

隨機(jī)閱讀

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有