将/ e修饰符替换为preg_replace_callback的问题

时间:2015-02-18 13:40:03

标签: php preg-replace preg-replace-callback

我在使用/ e修饰符将preg_replace替换为此函数中的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($这 - > TEMPLATEDIR '\ 1' '\ 2'。 '')。 file_get_contents($ this-> templateDir。'\ 1'。'。'。'\ 2')file_get_contents($ this-> templateDir。'\ 1'。'。'。'\ 2') file_get_contents($ this-> templateDir。'\''。'。'。'\ 2')file_get_contents($ this-> templateDir。'\ 1'。'。'。'\ 2')file_get_contents($ this - > ''。TEMPLATEDIR '\ 1' '\ 2')

我还是相对较新的php,所以我不知道如何处理这个问题。

3 个答案:

答案 0 :(得分:0)

最后,我理解你要做的事情。 回调函数应该接收所有匹配或单个匹配的数组(取决于找到的内容)。 所以它看起来像这样: $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)

答案 1 :(得分:0)

您有两个不同的变量$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 );

答案 2 :(得分:0)

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