【问题标题】:Deprecated: preg_replace(): The /e modifier is deprecated in phpmailer已弃用:preg_replace():/e 修饰符在 phpmailer 中已弃用
【发布时间】:2014-07-24 06:02:53
【问题描述】:

我正在使用 class.phpmailer.php 从本地服务器发送电子邮件,它在我的本地服务器中处理良好,PHP 版本为 php5.3.4,但在我将 PHP 版本更新为 5.5.4 后,它显示以下消息:

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in class.phpmailer.php`

这是导致错误的行:

$encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e', "'='.sprintf('%02X', ord(stripslashes('\\1')))", $encoded);

【问题讨论】:

  • 考虑到 PHP 版本的差异,这个错误非常简单。这意味着此版本中已弃用某些功能。在这种情况下 - /e 修饰符。错误消息中还提供了使用什么功能的建议。
  • 更新 PHPMailer 可以解决这个问题。这是一个reported bug,已修复。
  • @ljacqu urgh,sourceforge :(
  • 谢谢大家,现在我可以修复@ljacqu 告诉我删除e
  • sourceforge 项目早已死去; PHPMailer 现在是on Github

标签: php phpmailer


【解决方案1】:

尝试替换:

这个

$encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',"'='.sprintf('%02X', ord(stripslashes('\\1')))", $encoded);

$encoded = preg_replace_callback('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/',function($m) { return '='.sprintf('%02X', ord(stripslashes($m[1]))); }, $encoded);

【讨论】:

  • 别打扰,只需将 PHPMailer 更新到最新版本即可。
  • 我原来的行不叫“stripslashes”,但仍然有效! :)
【解决方案2】:
switch (strtolower($position)) {
  case 'phrase':
    //$encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
    $encoded = preg_replace_callback("/([^A-Za-z0-9!*+\/ -])/e",function($m) { return '='.sprintf('%02X', ord(stripslashes($m[1]))); }, $encoded);
    break;
  case 'comment':
    //$encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
    $encoded = preg_replace_callback("/([\(\)\"])/e",function($m) { return '='.sprintf('%02X', ord(stripslashes($m[1]))); }, $encoded);
  case 'text':
  default:
    // Replace every high ascii, control =, ? and _ characters
    //TODO using /e (equivalent to eval()) is probably not a good idea
    //$encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',"'='.sprintf('%02X', ord('\\1'))", $encoded);
    $encoded = preg_replace_callback('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/',function($m) { return '='.sprintf('%02X', ord(stripslashes($m[1]))); }, $encoded);
    break;
}

是的。它适用于 php 7.2。

【讨论】:

  • 它可以工作,但应该删除e 修饰符,否则可能会出现此错误:link
猜你喜欢
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 2013-10-15
  • 2014-04-29
  • 1970-01-01
相关资源
最近更新 更多