设为首页 加入收藏

TOP

UCenterHome1.5的模板语法解析(三)
2014-11-23 22:19:27 来源: 作者: 【 】 浏览:2
Tags:UCenterHome1.5 模板 语法 解析
eg_replace("/{ifs+(.+ )}(.+ ){/if}/ies", "stripvtags(< php if(\1) { >,\2< php } >)", $template);

/*

解析if

将类似

{if name1} expression1 {/if}

替换成

stripvtags(

<’ php if(name1) { >’,

‘expression1< php } >’

)

如space_doing.htm里将

{if empty(< =$_SGLOBAL[inajax] >)}

替换成

< php if(empty($_SGLOBAL[inajax])) { >

*/

}/*for循环结束*/

/*

为什么要有for循环呢?因为可能存在循环语句嵌套的情况。

比如space_doing.htm里有这么一段代码

{loop < =$list > < =$baseva lue >}

………

………

{loop < =$clist[$baseva lue[doid]] > < =$value >}

………

{/loop}

………

{/loop}

$i=0时,

$template = preg_replace("/{loops+(S+)s+(S+)}(.+ ){/loop}/ies", "stripvtags(< php if(is_array(\1)) { foreach(\1 as \2) { >,\3< php } } >)", $template);

只替换掉了外层的loop,内层的loop被(.+ )所匹配

表示懒惰匹配,否则后面的{/loop}都会被(.+)所匹配

但是既然是懒惰匹配,为什么(.+ )不是匹配到内层的{/loop}就停止呢?

因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权――The match that begins earliest wins。

$i=1时,内层的loop也将被替换掉

从这个for循环我们也可以看出,UCH的模板中最多允许5层嵌套循环,当然这已经足够了

*/

//常量

$template = preg_replace("/{([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)}/s", "< =\1 >", $template);

/*

比变量名少了一开始的$,也不考虑数组形式的常量

*/

//替换

if(!empty($_SGLOBAL[block_search])) {

$template = str_replace($_SGLOBAL[block_search], $_SGLOBAL[block_replace], $template);

}

//换行

$template = preg_replace("/ >[ ]*< /s", " ", $template);

/*

>

<

前一段php代码的结尾和下一段php代码的开始都被以空格代替了

*/

//附加处理

$template = "< php if(!defined(IN_UCHOME)) exit(Access Denied); >< php subtplcheck(".implode(|, $_SGLOBAL[sub_tpls]).", $_SGLOBAL[timestamp], $tpl); >$template< php ob_out(); >";

//write

if(!swritefile($objfile, $template)) {

exit("File: $objfile can not be write!");

}

/*

写入缓存文件

所以在template函数最后,无论$objfile一开始是否存在,最后都是返回$objfile

*/

}

function readtemplate($name) {

global $_SGLOBAL, $_SCONFIG;

$tpl = strexists($name,/) $name:"template/$_SCONFIG[template]/$name";

$tplfile = S_ROOT../.$tpl..htm;

$_SGLOBAL[sub_tpls][] = $tpl;

if(!file_exists($tplfile)) {

$tplfile = str_replace(/.$_SCONFIG[template]./, /default/, $tplfile);

}

/*

如果$_SCONFIG[template]风格的模板文件不存在,则改用default风格的模板文件

*/

$content = sreadfile($tplfile);

//读入模板文件的内容

return $content;

}

function addquote($var) {

return str_replace("\"", """, preg_replace("/[([a-zA-Z0-9_-.x7f-xff]+)]/s", "[\1]", $var));

/*

这个preg_replace感觉没什么用啊,[name1]替换成[name1]?

str_replace将\"替换成"

*/

}

function blocktags($parameter) {

global $_SGLOBAL;

$_SGLOBAL[i]++;

$search = "";

/*

按广告出现的次序,依次将{block/name}替换成BLOCK_TAG_1 BLOCK_TAG_2等等

*/

$_SGLOBAL[block_search][$_SGLOBAL[i]] = $search;

$_SGLOBAL[block_replace][$_SGLOBAL[i]] = "< php block("$parameter"); >";

return $search;

}

function adtags($pagetype) {

global $_SGLOBAL;

$_SGLOBAL[i]++;

$search = "";

/*

按广告出现的次序,依次将{ad/name}替换成AD_TAG_3 AD_TAG_4等等

这个编号是跟着前面的BLOCK_TAG来的

*/

$_SGLOBAL[block_search][$_SGLOBAL[i]] = $search;

$_SGLOBAL[block_replace][$_SGLOBAL[i]] = "< php adshow($pagetype); >";

return $search;

}

function datetags($parameter) {

global $_SGLOBAL;

$_SGLOBAL[i]++;

$search = "";

/*

按date模板方法出现的次序,依次将{date(name)}替换成DATE_TAG_7 DATE_TAG_8等等

注意这里的编号是跟着前面的AD_TAG来的

*/

$_SGLOBAL[block_search][$_SGLOBAL[i]] = $search;

$_SGLOBAL[block_replace][$_SGLOBAL[i]] = "< php echo sgmdate($parameter); >";

return $search;

}

function avatartags($parameter) {

global $_SGLOBAL;

$_SGLOBAL[i]++;

$search = "";

/*

按avatar模板方法出现的次序,依次将{avatar(name)}替换成AVATAR_TAG_9 AVATAR_TAG_10等等

注意这里的编号是跟着前面的DATE_TAG来的

*/

$_SGLOBAL[block_search][$_SGLOBAL[i]] = $search;

$_SGLOBAL[block_replace][$_SGLOBAL[i]] = "< php echo avatar($parameter); >";

return $search;

}

function eva ltags($php) {

g

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇#define的一些用法 下一篇开始聊聊C#泛型和委托(一)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: