【问题标题】:Should I avoid the FILTER_VALIDATE_EMAIL filter on all non-English sites?我应该避免在所有非英语网站上使用 FILTER_VALIDATE_EMAIL 过滤器吗?
【发布时间】:2014-04-13 16:30:53
【问题描述】:

我正在为我正在开发的挪威网站寻找验证电子邮件地址的最合适方法。我首先想到的是使用 PHP 的过滤功能 filter_var()FILTER_VALIDATE_EMAIL 过滤器。正是我需要的,对吧?嗯,问题是,在挪威,你可能偶尔会碰到带有 æ、ø 和 å 等字母的电子邮件地址。

所以,由于 FILTER_VALIDATE_EMAIL 过滤器不支持像 æ、ø 和 å 这样的字符,我开始认为我真的根本不能使用 filter_var() 函数——至少在非英文网站,对吧?

我想听听你们对此的看法。这是否意味着我应该手动编写大部分验证?在 PHP 中进行验证时,preg_match() 是否比 filter_var() 更好?

示例:

//$email = "ørnulf.åsen@gmail.com";
$email = "ørnulf.åsen@gmæil.com";

// How I would do it with preg_match()
$ok_characters = '[a-zæøå0-9!#$%&\'*+-\/=?^_`{|}~]';
$pattern = '/^' . $ok_characters . '+(\.' . $ok_characters . '+)*@' . $ok_characters . '+(\.' . $ok_characters . '+)*(\.[a-z]{2,4})$/i'; // [a-z]{2,4} should be replaced with the most known top-level domain names
if (preg_match($pattern, $email)) {
    echo 'this regexp thinks ' . $email . " is valid.";
} else {
    echo 'this regexp thinks ' . $email . " is invalid.";
}

// How I would do it with filter_var()
if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo 'filter_var thinks ' . $email . " is valid.";
} else {
    echo 'filter_var thinks ' . $email . " is invalid.";
}

结果:

preg_match() 验证两个电子邮件地址是否有效。但是filter_var() 函数认为两者都是无效的。

有什么建议吗?

【问题讨论】:

  • 请告诉我们你在 preg_match() 下做了什么?
  • 您是否尝试过正确设置语言环境?这可能会影响哪些字符被认为是有效的
  • 也许这可以帮助你stackoverflow.com/questions/5219848/…
  • 你认为语言环境能解决这个问题吗?我不确定这是否会影响 filter_var() 的严格验证。我试试看。

标签: php validation preg-match filter-var


【解决方案1】:

电子邮件地址的本地部分不应允许非英文字符,我认为任何电子邮件提供商都不会接受您提到的电子邮件地址的注册,因为许多电子邮件服务器不会接受消息从这样的地址。 您可以查看电子邮件地址的本地部分的规范: Wikipedia: Email Address Local Part 因为 FILTER_VALIDATE_EMAIL 应该始终满足您的需求。

【讨论】:

猜你喜欢
  • 2023-02-01
  • 2010-09-07
  • 2018-06-16
  • 2013-03-07
  • 2010-10-15
  • 2012-10-14
  • 2011-03-26
  • 2015-05-24
  • 1970-01-01
相关资源
最近更新 更多