解析QQ互联的模板文件module.htm代码
一直没搞明白QQ互联的module.htm的代码是如何解析的,模板里并不是真正的html代码。
这里截取一部分模板代码,如下:
{eval
function tpl_global_login_extra() {
global $_G;
}
{eval
}
function tpl_global_usernav_extra1() {
}
为了搞清楚Discuz是如何解析的,需要从模板机制上分析。
找到source\class\class_template.php文件,其中有下面的代码片段:
$template = preg_replace("/[\n\r\t]*\{eval\s+(.+?)\s*\}[\n\r\t]*/ies", "\$this->evaltags('\\1')", $template);
这段代码是用来处理类似下面的模板代码的:
{eval
function tpl_global_login_extra() {
global $_G;
}
解析的机制为:
function evaltags($php) {
$php = str_replace('\"', '"', $php);
$i = count($this->replacecode['search']);
$this->replacecode['search'][$i] = $search = "";
$this->replacecode['replace'][$i] = "";
return $search;
}
$template = preg_replace("/[\n\r\t]*\{block\s+([a-zA-Z0-9_\[\]]+)\}(.+?)\{\/block\}/ies", "\$this->stripblock('\\1', '\\2')", $template);
这段代码是用来处理类似下面的模板代码:
解析的机制为:
function stripblock($var, $s) {
$s = str_replace('\\"', '"', $s);
$s = preg_replace("/<\?=\\\$(.+?)\?>/", "{\$\\1}", $s);
preg_match_all("/<\?=(.+?)\?>/e", $s, $constary);
$constadd = '';
$constary[1] = array_unique($constary[1]);
foreach($constary[1] as $const) {
$constadd .= '$__'.$const.' = '.$const.';';
}
$s = preg_replace("/<\?=(.+?)\?>/", "{\$__\\1}", $s);
$s = str_replace('?>', "\n\$$var .= <<";
}
