解析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 .= <<"; }