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


Posted in PHP onAugust 21, 2010

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

测试代码打包下载
PHP 相关文章推荐
一个目录遍历函数
Oct 09 PHP
解决ajax+php中文乱码的方法详解
Jun 09 PHP
PHP 实现explort() 功能的详解
Jun 20 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
php中$_GET与$_POST过滤sql注入的方法
Nov 03 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
php有道翻译api调用方法实例
Dec 22 PHP
帝国CMS留言板回复后发送EMAIL通知客户
Jul 06 PHP
PHP开发Apache服务器配置
Jul 15 PHP
必须收藏的php实用代码片段
Feb 02 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
Oct 16 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
Aug 21 #PHP
使用VisualStudio开发php的图文设置方法
Aug 21 #PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
Aug 21 #PHP
ThinkPHP中实例Model方法的区别说明
Aug 21 #PHP
PHP 数组基础知识小结
Aug 20 #PHP
一个简单php扩展介绍与开发教程
Aug 19 #PHP
php checkbox 取值详细说明
Aug 19 #PHP
You might like
php cookie的操作实现代码(登录)
2010/12/29 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
javascript 日期时间 转换的方法
2013/02/21 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
2016/12/16 Javascript
JavaScript定时器制作弹窗小广告
2017/02/05 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
微信小程序 组件的外部样式externalClasses使用详解
2019/09/06 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
python @property的用法及含义全面解析
2018/02/01 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
Python Pandas批量读取csv文件到dataframe的方法
2018/10/08 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
法国二手MacBook销售网站:Okamac
2019/03/18 全球购物
俄罗斯护发和专业化妆品购物网站:Hihair
2019/09/28 全球购物
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
个人委托书如何写
2014/09/25 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python