首页 > 解决方案 > idn_to_ascii():INTL_IDNA_VARIANT_2003 已弃用

问题描述

我正在为我的网站使用 codeigniter 框架,但是在 form_validation 中我收到错误我在 stackoverflow 中点击了这个链接,但它对我不起作用, 在 5.2.17 中点击了链接:idn_to_ascii()

问题:

codeigniter 库/form_validation.php 中的代码:

public function valid_email($str)
    {
        if (function_exists('idn_to_ascii') && preg_match('#\A([^@]+)@(.+)\z#', $str, $matches))
        {
            $domain = defined('INTL_IDNA_VARIANT_UTS46')
                ? idn_to_ascii($matches[2], 0, INTL_IDNA_VARIANT_UTS46)
                : idn_to_ascii($matches[2]);

            if ($domain !== FALSE)
            {
                $str = $matches[1].'@'.$domain;
            }
        }

        return (bool) filter_var($str, FILTER_VALIDATE_EMAIL);
    }

标签: phpcodeigniterlibrariescodeigniter-form-validation

解决方案


理想的解决方案是将 ICU 升级到最新版本

由于这在我的共享服务器上是不可能的,我解决了这个问题,扩展了 CI 电子邮件库:

  • 否决使用 的 valid_email() 函数,INTL_IDNA_VARIANT_UTS46不幸的是,它没有安装在我的服务器上。

  • PhP 7.2 适用于该版本,因此如果您已INTL_IDNA_VARIANT_2003安装,您会收到上述已弃用的错误消息。

  • 解决方案:您需要从 2.0 版本的电子邮件库返回到 valid_email() 函数:

    class MY_Email extends CI_Email {
    
      public function valid_email($address)
      {
         return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address)) ? FALSE : TRUE;
      }
    
    }
    

将此扩展类保存为 MY_email.php 在您的应用程序/库文件夹中。关于Extending Native Libraries,前缀MY_是可配置的。


推荐阅读