php - 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);
}
解决方案
理想的解决方案是将 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_
是可配置的。