Я знаю, что этому посту уже более года, но у меня есть решение.Легковесность синтаксического анализатора шаблона CI - все, что мне было нужно для недавнего проекта, но я также столкнулся с этой проблемой, когда одна и та же пара переменных встречалась несколько раз в одном и том же шаблоне.Я решил это, полагаясь на способность str_replace () заменять массивы строк.Добавьте код ниже в ./application/libraries/MY_Parser.php:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Overrides the CI Template Parser to allow for multiple occurrences of the
* same variable pair
*
*/
class MY_Parser extends CI_Parser {
/**
* Parse a tag pair
*
* Parses tag pairs: {some_tag} string... {/some_tag}
*
* @access private
* @param string
* @param array
* @param string
* @return string
*/
function _parse_pair($variable, $data, $string)
{
if (FALSE === ($match = $this->_match_pair($string, $variable)))
{
return $string;
}
$str = array();
foreach ($match['0'] as $mkey => $mval)
{
$str[$mkey] = '';
foreach ($data as $row)
{
$temp = $match['1'][$mkey];
foreach ($row as $key => $val)
{
if ( ! is_array($val))
{
$temp = $this->_parse_single($key, $val, $temp);
}
else
{
$temp = $this->_parse_pair($key, $val, $temp);
}
}
$str[$mkey] .= $temp;
}
}
return str_replace($match['0'], $str, $string);
}
// --------------------------------------------------------------------
/**
* Matches a variable pair
*
* @access private
* @param string
* @param string
* @return mixed
*/
function _match_pair($string, $variable)
{
if ( ! preg_match_all("|" . preg_quote($this->l_delim) . $variable . preg_quote($this->r_delim) . "(.+?)". preg_quote($this->l_delim) . '/' . $variable . preg_quote($this->r_delim) . "|s", $string, $match))
{
return FALSE;
}
return $match;
}
}
// END Parser Class
/* End of file MY_Parser.php */
/* Location: ./application/libraries/MY_Parser.php */