解析QQ互联的模板文件module.htm代码

一直没搞明白QQ互联的module.htm的代码是如何解析的,模板里并不是真正的html代码。
这里截取一部分模板代码,如下:

{eval
function tpl_global_login_extra() {
global $_G;
}

	

{lang qqconnect:connect_header_login}

{lang qqconnect:connect_header_login_tip}

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

这段代码是用来处理类似下面的模板代码:


	

{lang qqconnect:connect_header_login}

{lang qqconnect:connect_header_login_tip}

这句代码解析后的代码为:

解析的机制为:

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

标签: none

添加新评论