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

织梦教程 强烈建议 2024-02-06 13:40 105 0

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

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

  为field标签添加一个function属性

  

  require_once(dirname(__FILE__)."/");

  //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)

  {

  // 取出标签相应的属性字符串并把属性转化成一个数组,如 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];

  // 把字符串中的[field:xxxx/]替换成$row['xxxx']变量。

  $_re='/\[field:(\w+)(\s+function=("|\')(\w+)\((.*)\)\3)?/\]/U';

  preg_match_all($_re, $_tep, $_a);

  // 再循环每一条 记录中的每个字段的值

  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('', $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;

  }



时间:(2024-02-06 13:40:27)
本站资源均来自互联网或会员发布,如果不小心侵犯了您的权益请与我们联系。我们将立即删除!谢谢!