У меня возникли некоторые проблемы с заменой preg_replace с модификатором / e на preg_replace_callback в этой функции:
private function parseFunctions() {
// replaces includes ( {include file="..."} )
while( preg_match( "/" .$this->leftDelimiterF ."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF ."/isUe", $this->template) )
{
$this->template = preg_replace( "/" .$this->leftDelimiterF ."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isUe",
"file_get_contents(\$this->templateDir.'\\1'.'.'.'\\2')",
$this->template );
}// deletes comments from the template files
$this->template = preg_replace( "/" .$this->leftDelimiterC ."(.*)" .$this->rightDelimiterC ."/isUe",
"", $this->template );
}
ты можешь помочь мне с этим?
РЕДАКТИРОВАТЬ:
Мне удалось исправить второй, но другой
{
$this->template = preg_replace_callback( "/" .$this->leftDelimiterF ."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isU",
function(){$replacement="file_get_contents(\$this->templateDir.'\\1'.'.'.'\\2')";
return $replacement;},
$this->template );
}
не работал.
Я получил следующее сообщение об ошибке:
file_get_contents ($ this-> templateDir. ‘\ 1’. ». ‘\ 2’)
file_get_contents ($ this-> templateDir. ‘\ 1’. ‘.’. ‘\ 2’) file_get_contents ($ this-> templateDir. ‘\ 1’. ‘.’. ‘\ 2’)
file_get_contents ($ this-> templateDir. ‘\ 1’. ‘.’. ‘\ 2’) file_get_contents ($ this-> templateDir. ‘\ 1’. ‘.’. ‘\ 2’) file_get_contents ($ this-> templateDir. ‘\ 1’. ». ‘\ 2’)
Я все еще относительно новичок в php, поэтому я не уверен, как справиться с этой проблемой.
Наконец я понял, что вы пытаетесь сделать.
Функция обратного вызова должна получить массив всех совпадений или одно совпадение (в зависимости от того, что было найдено).
Так это будет выглядеть примерно так:
$this->template = preg_replace_callback( "/" .$this->leftDelimiterF ."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isU",
function($match){
$replacement="file_get_contents(\$this->match.'\\1'.'.'.'\\2')";
return $replacement;},
this->template );
Если вам нужна какая-то внешняя переменная внутри анонимной функции, объявите функцию обратного вызова как
function($match) use ($varname)
У вас есть 2 разные переменные $match
а также $matches
, Вот рабочий код:
$this->template = preg_replace_callback(
"/".$this->leftDelimiterF.'include file="([^"]+)"'.$this->rightDelimiterF."/isU",
function($match){
$replacement = "file_get_contents(\$this->templateDir.$match[1])";
return $replacement;
},
$this->template );
$this->template = preg_replace_callback("/" .$this->leftDelimiterF ."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isU",
function ($m) { return file_get_contents($this->templateDir.$m[1].'.'.$m[2]);},
$this->template);