【问题标题】:PHP email validation [duplicate]PHP电子邮件验证[重复]
【发布时间】:2011-04-06 12:41:52
【问题描述】:

对于 PHP,使用 preg 的最佳电子邮件验证是什么,不是 ereg,因为它已被弃用/删除

不需要检查网站是否存在(这不像是最高安全性)。

我找到了很多使用 ereg 的方法,但它们(显然)不是好的做法。

【问题讨论】:

    标签: php regex preg-match email-validation


    【解决方案1】:
    function check_email($check) {
    $expression = "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$/";
    if (preg_match($expression, $check)) {
        return true;
    } else {
        return false;
    } 
    }
    

    在 if() 条件下调用它,如下例:

    if(!check_email($_REQUEST['ContactEmail'])){
      $register_error ="Enter the correct email address!<br />";
      $reg_error=1; 
    }
    

    【讨论】:

    • 谁能告诉我这个代码中的问题是什么,因为有人在投票中失败了。它工作正常。
    • 投反对票的不是我,而是....正确过滤电子邮件地址是不正确的,正确且完整的正则表达式可以在这里找到:ex-parrot.com/~pdw/Mail-RFC822-Address.html 其次使用内置在 FILTER_VALIDATE_EMAIL 中的 PHP 将是过滤电子邮件地址的正确/最佳方式
    【解决方案2】:

    除非您想使用very very long regular expressions,否则您会遇到未被覆盖的有效电子邮件地址(想想 Unicode)。假的电子邮件地址也会作为有效地址通过,那么验证您是否可以简单地写 test@test.com 并侥幸逃脱有什么意义?

    验证电子邮件地址的最佳方式是发送一封确认电子邮件,其中包含可供点击的链接。这仅在电子邮件地址有效时才有效:简单,无需使用正则表达式。

    【讨论】:

    • 就像我说的那样,这不像是最高安全性
    • 一个合理的开发者总是会在尝试向“字符串”发送电子邮件之前检查给定地址的有效性。所以这不是论据。但是无论如何都应该进行双重选择 - 这不是问题。
    • @Jan.:那么,如果我的电子邮件是 àèìòù@mydomain.com 并且您的抢先检查阻止我注册到您的网站怎么办?只需发送一封确认电子邮件即可完成设置,无需在之前检查有效性并冒着阻止有效电子邮件地址的风险。
    • @nico:根据 RFC2821 和 RFC2822,您的示例无效。两者都明确指出只允许使用 7 位 ASCII 字符.. 甚至 any 都不允许。我最好放弃这样一个错误的地址,而不是让垃圾邮件发送者通过一些神奇的标头注入被服务器滥用。此外,维基百科关于本地部分的国际化声明如下:“当 EAI 标准化时,用户可能会有本地语言脚本或字符集的本地化地址,以及用于与遗留系统或脚本通信的 ASCII 形式 -独立使用”...问候。
    • 请阅读有关邮件头注入的信息,以了解我在说什么。
    【解决方案3】:

    我建议你使用FILTER_VALIDATE_EMAIL 过滤器:

    if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
        //valid
    }
    

    你也可以直接使用its regular expression

    "/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD"
    

    但在这种情况下,如果在正则表达式中发现错误,您将不得不更新您的程序,而不仅仅是更新 PHP。

    【讨论】:

    • 请记住,电子邮件还可以包含以下字符:` ' / *`。所以这个验证并不能保证数据库安全。
    • filter_var() 对我来说是新的。 FILTER_VALIDATE_EMAIL 好吗?
    • +1 获取源代码参考。很棒
    • 源代码链接已失效。最新链接是here。正则表达式也发生了变化。
    猜你喜欢
    • 2011-06-21
    • 2011-01-22
    • 2011-01-09
    • 2011-03-30
    • 2011-07-16
    • 2013-09-25
    • 2012-05-20
    • 2013-01-18
    • 2013-02-12
    相关资源
    最近更新 更多