如何用 preg_replace_callback 替换此 preg_replace 以获得 php 5.6 兼容性

How to replace this preg_replace by preg_replace_callback for php 5.6 compatibility

我正在尝试更新一些已有 20 年历史的代码以与 php 5.6 兼容。我面临的主要变化之一是 preg_replace.

中“/e”修饰符的弃用

对于其中的大多数,我只是将其替换为 preg_replace_callback,删除了“/e”并使用了一个函数作为第二个参数。

但我遇到了它不起作用的情况,在尝试了很多东西之后,我仍然无法重现它之前的工作方式。

function _munge_input($template) {
    $orig[] = '/<\?plugin.*?\?>/se';
    $repl[] = "$this->_mungePlugin('\0')";

    $orig[] = '/<\?=(.*?)\?>/s';
    $repl[] = '<?php $this->_print();?>';

    return preg_replace($orig, $repl, $template);
}

我尝试用 :

替换 $repl
function ($matches) use ($repl) {
    return $repl;
}

(甚至直接在函数中包含 $repl 赋值)

修改了第一个 $repl 赋值:

$repl[] = "$this->_mungePlugin('$matches[0]')";

但是还是不行

感谢您的帮助。

最后,它适用于此代码:

function _munge_input($template) {
    $that = $this;
    $template = preg_replace_callback(
        '/<\?plugin.*?\?>/s',
        function ($matches) use ($that) {
            return $that->_mungePlugin($matches[0]);
        },
        $template
    );

    $template = preg_replace('/<\?=(.*?)\?>/s', '<?php $this->_print();?>', $template);

    return $template;
}

正如您告诉我的那样,问题是在另一个范围内使用了 $this。

非常感谢 wiktor stribiżew。您的代码更好,但 /e 不关心第二部分,所以我改回 preg_replace。

最佳。