idn_to_ascii():INTL_IDNA_VARIANT_2003 已弃用

idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated

我正在为我的站点使用 codeigniter 框架,但在 form_validation 中出现错误 我在 Whosebug 中遵循了此 link 但它对我不起作用 关注 link: idn_to_ascii() in 5.2.17

问题:

codeigniter 中的代码 libraries/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);
    }

理想的解决方案是 upgrade ICU to its latest version

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

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

  • 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;
      }
    
    }
    

在您的 application/libraries 文件夹中将此扩展 Class 另存为 MY_email.php。关于Extending Native Libraries,前缀MY_可配置