private function closeTag($data, $rule = '')
{
static $tag, $reg, $func, $count = 0;
if (is_string($data)) {
list($tag, $reg[0], $reg[1], $func) = $rule;
do {
$data = preg_replace_callback("/({$reg[0]})(.*?)({$reg[1]})/is", [$this, 'closeTag'], $data);
} while ($count && $count--);
//递归解析,直到嵌套解析完毕
return $data;
} elseif (is_array($data)) {
$num = count($data);
if (preg_match("/{$reg[0]}/is", $data[$num - 2])) {
//存在嵌套,进一步解析
$count = 1;
$data[$num - 2] = preg_replace_callback("/({$reg[0]})(.*?)({$reg[1]})/is", [$this, 'closeTag'], $data[$num - 2] . $data[$num - 1]);
return $data[1] . $data[$num - 2];
} else {
//不存在嵌套,直接解析内容
$parse = '_' . $func;
$data[$num - 2] = trim($data[$num - 2], "\r\n");
//去掉标签内容两端的换行符
return $this->{$parse}($tag, $data);
}
}
}