手机
当前位置:查字典教程网 >编程开发 >php教程 >php下正则来匹配dede模板标签的代码
php下正则来匹配dede模板标签的代码
摘要:html代码复制代码代码如下:{t:arcrow='10'}{t:field.title/}{t:listrow='5'}{t:field....

html代码

复制代码 代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

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

<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

)

)

)

测试代码打包下载

【php下正则来匹配dede模板标签的代码】相关文章:

我的论坛源代码(九)

php curl请求信息和返回信息设置代码实例

php从文件夹随机读取文件的方法

我的论坛源代码(六)

php判断文本文档字符编码

PHP中preg_match函数正则匹配的字符串长度问题

php将字符串随机分割成不同长度数组的方法

php动态绑定变量的用法

php编写批量生成不重复的卡号密码代码

php使用标签替换的方式生成静态页面

精品推荐
分类导航