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