php下正则来匹配dede模板标签的代码

2018-09-07 21:27

阅读:311

  html代码
复制代码 代码如下:
<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN
<html xmlns=
<head>
<meta http-equiv=Content-Type content=text/html; charset=utf-8 />
<title></title>
</head>
<body>
{t:arc row=10}
{t:field.title/}
{t:list row=5}
{t:field.title/}
{t:list row=5}
{t:field.title/}
{/t:list}{t:field.title/}
{/t:list}{t:field.title/}
{/t:arc}
{T:channelartlist
row=6
}
<dl>
<dt>{t:field name=typename/}{t:field.typename/}</dt>
<dd>
{t:arclist titlelen=42 row=10}
<ul class=autod>
<li>[field:title/]</li>
<li>([field:sendtime function=MyDate(m-d,@me)/])</li>
</ul>
{/t:arclist}
</dl>{/t:channelartlist
}
{t:global.cfg_title
/}{t:var.cfg_title/}{t:global.cfg_webname /}{t:global.cfg_title/}{t:var.cfg_title/}
{t:field.title function=Html2Text(@me)/}
{t:include
filename=header.htm/}
{t:include filename=header.htm
/}
{t:field.title function=Html2Text(@me) }{/t:field
}
{t:array name=asdas }{/t:array
}
{t:channel typeid=1 row=15}
[field:id/][field:typename/]
{/t:channel
}
{t:channel typeid=1} [field:id/] [field:typename/]{/t:channel}
{t:channel typeid=1 }[field:id/]
[field:typename/]{/t:channel
}sd
{t:channel}[field:typename/]{/t:channel
}
{t:channel typeid=1 row=20 }[field:userid/]
[field:scores/]
{/t:channel
}
</body>
</html>

php代码
复制代码 代码如下:
<?php
$str = file_get_contents(test.htm);
$skstr={;
$skdstr=t:;
$sdstr=};
//$reg=/{t:.*?(?:\/).*?}/si;//此无法匹配嵌套,只能一层 si s: 使前面的. 包括换行符 i:不区分大小写
//$reg=/({t:*[^{]*\/}{t:*[^}]*}([^{](?R))*{\/t:.*?})/si;无限嵌套都可截取.
$reg=/(.$skstr.$skdstr.*[^.$skstr.]*\/.$sdstr..$skstr.$skdstr.*[^.$sdstr.]*.$sdstr.([^.$skstr.](?R))*.$skstr.\/.$skdstr..*?.$sdstr.)/si;
preg_match_all($reg,$str,$m);
/*echo <pre>;print_r($m[0]);echo </pre>;exit();*/
$CTags=array();
$glarr1=array($skstr.$skdstr=>);//array({t:=>);前缀
$glarr2=array(=>,\=>,$=>,/=>);
/*
{t:array typeid=1}[field:typename/]{/t:array}
{t:global.title function=html2text(@me)/}
*/
foreach($m[0] as $k=>$v){
$rarr=array();
$rarr[str]=$v; //原模板字符串
$vs=explode(},$v); //分割取得第一部分 {t:array typeid=1
$va=explode( ,$vs[0]); //分割属性 {t:array , typeid=1
$vb=explode(.,$va[0]); //分割标签名和字段名 {t:global.title
$rarr[tagname]=trim(strtr(strtolower($vb[0]),$glarr1));//过滤前缀{t: 取得标签名 array 或 golbal
$rarr[tagfield]=strtr($vb[1],$glarr2); //取得字段名 title
unset($vs[0]);$vsstr=implode(},$vs); //去掉前缀,返回后半段: [field:typename/]{/t:array}
$rarr[text]=preg_replace(/.$skstr.\/.$skdstr.$rarr[tagname].(.*?).$sdstr./si,,$vsstr);
/*过滤后缀 {/t:array} 取得中间文本.
可能出现,空格或者换行所以使用正则,也可直接使用strtr 替换 。
{/t:array }
{/t:array
}
strtr(strtolower($vsstr),array($skstr./.$skdstr.$rarr[tagname].$sdstr=>));
*/
unset($va[0]);
$attr=array();
foreach($va as $val){//循环记录属性
$val=strtr($val,$glarr2); //typeid=1 去掉 / , typeid=1
$vc=explode(=,$val);
if(!empty($vc[0])){
$vc[0]=strtolower($vc[0]); //小写属性名
if($vc[0]==function){
$rarr[function]=$vc[1]; //返回要执行的 html2text(@me)
}else if($vc[0]==name){
$rarr[tagfield]=$vc[1]; //{t:field name=title /}
}else{
$attr[trim($vc[0])]=$vc[1]; //属性 $attr[typeid]=1;
}
}
}
$rarr[attr]=$attr;
$CTags[$k]=$rarr;
}
echo <pre>;
print_r($CTags);
echo </pre>;
?>

输出内容:
复制代码 代码如下:
Array
(
[0] => Array
(
[str] => {t:arc row=10}
{t:field.title/}
{t:list row=5}
{t:field.title/}
{t:list row=5}
{t:field.title/}
{/t:list}{t:field.title/}
{/t:list}{t:field.title/}
{/t:arc}
[tagname] => arc
[tagfield] =>
[text] =>
{t:field.title/}
{t:list row=5}
{t:field.title/}
{t:list row=5}
{t:field.title/}
{/t:list}{t:field.title/}
{/t:list}{t:field.title/}
[attr] => Array
(
[row] => 10
)
)
[1] => Array
(
[str] => {T:channelartlist
row=6
}
{t:field name=typename/}{t:field.typename/}
{t:arclist titlelen=42 row=10}
[field:title/]
([field:sendtime function=MyDate(m-d,@me)/])
{/t:arclist}
{/t:channelartlist
}
[tagname] => channelartlist
[tagfield] =>
[text] =>
{t:field name=typename/}{t:field.typename/}
{t:arclist titlelen=42 row=10}
[field:title/]
([field:sendtime function=MyDate(m-d,@me)/])
{/t:arclist}
[attr] => Array
(
[row] => 6
)
)
[2] => Array
(
[str] => {t:global.cfg_title
/}
[tagname] => global
[tagfield] => cfg_title
[text] =>
[attr] => Array
(
)
)
[3] => Array
(
[str] => {t:var.cfg_title/}
[tagname] => var
[tagfield] => cfg_title
[text] =>
[attr] => Array
(
)
)
[4] => Array
(
[str] => {t:global.cfg_webname /}
[tagname] => global
[tagfield] => cfg_webname
[text] =>
[attr] => Array
(
)
)
[5] => Array
(
[str] => {t:global.cfg_title/}
[tagname] => global
[tagfield] => cfg_title
[text] =>
[attr] => Array
(
)
)
[6] => Array
(
[str] => {t:var.cfg_title/}
[tagname] => var
[tagfield] => cfg_title
[text] =>
[attr] => Array
(
)
)
[7] => Array
(
[str] => {t:field.title function=Html2Text(@me)/}
[tagname] => field
[tagfield] => title
[text] =>
[function] => Html2Text(@me)
[attr] => Array
(
)
)
[8] => Array
(
[str] => {t:include
filename=header.htm/}
[tagname] => include
[tagfield] =>
[text] =>
[attr] => Array
(
[filename] => header.htm
)
)
[9] => Array
(
[str] => {t:include filename=header.htm
/}
[tagname] => include
[tagfield] =>
[text] =>
[attr] => Array
(
[filename] => header.htm
)
)
[10] => Array
(
[str] => {t:field.title function=Html2Text(@me) }{/t:field
}
[tagname] => field
[tagfield] => title
[text] =>
[function] => Html2Text(@me)
[attr] => Array
(
)
)
[11] => Array
(
[str] => {t:array name=asdas }{/t:array
}
[tagname] => array
[tagfield] => asdas
[text] =>
[attr] => Array
(
)
)
[12] => Array
(
[str] => {t:channel typeid=1 row=15}
[field:id/][field:typename/]
{/t:channel
}
[tagname] => channel
[tagfield] =>
[text] =>
[field:id/][field:typename/]
[attr] => Array
(
[typeid] => 1
[row] => 15
)
)
[13] => Array
(
[str] => {t:channel typeid=1} [field:id/] [field:typename/]{/t:channel}
[tagname] => channel
[tagfield] =>
[text] => [field:id/] [field:typename/]
[attr] => Array
(
[typeid] => 1
)
)
[14] => Array
(
[str] => {t:channel typeid=1 }[field:id/]
[field:typename/]{/t:channel
}
[tagname] => channel
[tagfield] =>
[text] => [field:id/]
[field:typename/]
[attr] => Array
(
[typeid] => 1
)
)
[15] => Array
(
[str] => {t:channel}[field:typename/]{/t:channel
}
[tagname] => channel
[tagfield] =>
[text] => [field:typename/]
[attr] => Array
(
)
)
[16] => Array
(
[str] => {t:channel typeid=1 row=20 }[field:userid/]
[field:scores/]
{/t:channel
}
[tagname] => channel
[tagfield] =>
[text] => [field:userid/]
[field:scores/]
[attr] => Array
(
[typeid] => 1
[row] => 20
)
)
)

测试代码打包下载


评论


亲,登录后才可以留言!