从 preg_replace 到 preg_replace_callback

Posted

技术标签:

【中文标题】从 preg_replace 到 preg_replace_callback【英文标题】:FROM preg_replace TO preg_replace_callback 【发布时间】:2014-04-27 02:59:06 【问题描述】:

各位网友大家好!

我在将一些旧函数更新为 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);

老了! 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);

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

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

【问题讨论】:

抱歉,有什么问题? 哦,感谢您的关注!我不知道我在尝试中做错了什么(第二个代码块) 好的,您遇到错误了吗?如果有,它们是什么?请将它们添加到问题中,这将使我们更容易为您提供帮助。 抱歉.. 我刚刚将错误添加到我的原始帖子中 :) 感谢您抽出宝贵时间解决我的问题 【参考方案1】:

正如消息中所说,删除了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
);

【讨论】:

效果很好!至少它给了我一个新的错误。抱歉,我还不能投票给你,我需要更多的代表 现在它抛出了我:警告:preg_replace_callback() 至少需要 3 个参数,2 个在 /var/www/inc/engine.php 第 52 行给出 @mlv:我已经编辑了整个指令。它对我来说很好用。可能是你用错了。 谢谢!它不起作用,因为我试图将 templ 作为变量而不是函数返回...返回 @templ ... 这并不能解决问题,只是那个错误(谢谢你帮助我)

以上是关于从 preg_replace 到 preg_replace_callback的主要内容,如果未能解决你的问题,请参考以下文章

PHP php使用preg_replace从文本中删除特殊字符

如何将 % 添加到以下 preg_replace 代码及其工作原理

preg_replace、preg_replace_callback 和数组到字符串的转换

preg_replace/string_replace 符号 - 或 * 到空格

PHP7 preg_replace出错及解决办法

preg_replace 非 alpha,留下单个空格