如何用 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。
最佳。
我正在尝试更新一些已有 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);
}
我尝试用 :
替换 $replfunction ($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。
最佳。