preg_replace() → preg_replace_callback()重写出错? [Smarty_Compiler.class.php]

Error in preg_replace () → preg_replace_callback () rewriting? [Smarty_Compiler.class.php]

升级PHP到版本7后,Smarty_Compiler.class.php出现警告。

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /var/www/……/Smarty/Smarty_Compiler.class.php on line 271

查看错误位置……↓

$source_content = preg_replace($search.'e', "'"
                                   . $this->_quote_replace($this->left_delimiter) . 'php'
                                   . "' . str_repeat(\"\n\", substr_count('\0', \"\n\")) .'"
                                   . $this->_quote_replace($this->right_delimiter)
                                   . "'"
                                   , $source_content);

Preg_replace() 好像不能用,我改成了preg_replace_callback().

$source_content = preg_replace_callback($search
                                   , function($matches) {
                                         return  "'" 
                                                . $this->_quote_replace($this->left_delimiter) . 'php'
                                                . "' . str_repeat(\"\n\", substr_count('" . $matches[0] . "', \"\n\")) .'"
                                                . $this->_quote_replace($this->right_delimiter)
                                                . "'";
                                     }
                                   , $source_content);

那么,这次就出现了Smarty错误......

Fatal error: Smarty error: [in PATH]: syntax error: unrecognized tag: php' . str_repeat(" ", substr_count('{*version {$ZEND_VERSION (Smarty_Compiler.class.php, line 458) in /var/www/……/Smarty/Smarty.class.php on line 1095

在错误的地方,版本信息被注释掉了。 在升级PHP之前是可以正常使用的,所以我认为我在preg_replace_callback()重写时出错了,但我不知道哪里错了...... 另外,我不确定 Smarty_Compiler.class.php 这个过程在做什么...... 如果您熟悉 PHP 或 Smarty,请告诉我。

Smarty 是一个模板引擎,一个库,你不应该自己修改它的代码。而是尝试将您使用的版本升级到最新版本。好像支持PHP7.

试试这个

    $source_content = preg_replace_callback($search,
        function($matches) {
            return
                $this->_quote_replace($this->left_delimiter) . 'php' . str_repeat(
                    $this->_quote_replace("\n"),
                    substr_count($matches[0], $this->_quote_replace("\n"))
                )
                . $this->_quote_replace($this->right_delimiter);
          },
          $source_content
    );