从preg_replace到preg_replace_callback

时间:2014-03-20 10:27:48

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

Hello netheads!

我在将一些旧函数更新为preg_replace_callback时遇到问题。 编辑:我做错了什么?

这是我的第一个(preg_replace / deprecated)函数:

if ($handle) {
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    @eval('$templ = new '.TEMPL_CLASS.';');
    $buffer = preg_replace("#§([a-z0-9-_]+)\.?([a-z0-9-_]+)?#ie","\$templ->\\1(\\2)",$buffer);
    $out .= $buffer;
    }
fclose($handle);
}

第二个函数(这是我尝试转换为preg_replace_callback):

if ($handle) {
  while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    @eval('$templ = new '.TEMPL_CLASS.';');  
    $buffer = preg_replace_callback(
      '#§([\w-]+)\.?([\w-]+)?#',
      function ($m) {
        @$templ->$m[1]($m[2]);   
      },
      $buffer
    );
    $out .= $buffer;
  }
  fclose($handle);
}

OLD! M42的安装修复了以下错误:

  

警告:preg_replace_callback():修饰符/ e不能用于   第52行/var/www/inc/engine.php中的替换回调

); <-- line 52
$out .= $buffer;

编辑:我不知道如何处理这个渲染部分..

$buffer = preg_replace("#§([a-z0-9-_]+)\.?([a-z0-9-_]+)?#ie","\$templ->\\1(\\2)",$buffer);

现在它正在呈现一个空白页面..我猜错误在

  

返回templ($ m [1],$ m [2]);

1 个答案:

答案 0 :(得分:4)

正如消息中所述,删除了e修饰符:

'#§\\(\\[a-z0-9-_\\]+\\)\.?\\(\\[a-z0-9-_\\]+\\)?#i'
//                                         here ___^

并且没有必要逃避所有这些角色:

'#§([a-z0-9_-]+)\.?([a-z0-9_-]+)?#i'

[a-z0-9_]可以重写\w,并且不需要i修饰符

'#§([\w-]+)\.?([\w-]+)?#'

整个指令变为:

$buffer = preg_replace_callback(
  '#§([\w-]+)\.?([\w-]+)?#',
  function ($m) {
    return templ($m[1], $m[2]);
  },
  $buffer
);