我有此函数来验证电子邮件地址︰

function validateEMAIL($EMAIL) {
    $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";

    return (bool)preg_match($v, $EMAIL);
}

是否继续检查电子邮件地址是否有效?

2012-08-19 13:29:34
问题评论:

如果它起作用的工作。真的不能更好地使它,而是太小。不是很好的一点是样式。validateEmail是 corret,以及传递$email,不$EMAIL.

只是想确保在所有的代码都没有任何重大问题:)

请参阅有关如何以及如何不使用正则表达式来验证电子邮件地址stackoverflow.com/questions/201323/...

将不能验证多个有效的电子邮件地址。例如 *@example.com 或 @example.com 或 me@[127.0.0.1] 或 you@[ipv6:08B0:1123:AAAA::1234]

@jcoder,不,我要推荐该正则表达式,但我们至少可以希望:) 失败时不会抱怨等组成的字符串的使用此类地址的任何人

回答:

检查电子邮件地址是否是格式良好的最简单和最安全方法是使用filter_var()函数︰

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // invalid emailaddress
}

此外,您可以检查域是否定义MX记录︰

if (!checkdnsrr($domain, 'MX')) {
    // domain is not valid
}

但这仍不能保证邮件存在。找到了的唯一办法是通过发送确认邮件。


现在,您有您轻松应答尽情地自学有关电子邮件地址验证如果您介意地了解或否则为就使用快速的答案并继续。没有硬的感觉。

尝试验证电子邮件地址使用正则表达式是一个"不可能"的任务。我会尽量说该正则表达式所做毫无用处。有三种 rfc 的有关 emailaddresses 和编写正则表达式捕获错误 emailadresses 和同一时间没有假阳性,是没有可可以做的事情。对 PHP 的filter_var()函数使用的正则表达式检查出此列表的测试 (失败和成功)。

甚至内置 PHP 函数、 电子邮件客户端或服务器不准确。在大多数情况下filter_var仍是最佳选择。

如果您想要知道正则表达式模式 (目前) PHP 使用来验证电子邮件地址请参阅PHP 源代码.

如果您想了解有关的电子邮件地址,我建议您开始阅读规范,但是我不得不向您发出警告不是通过任何拉伸易于阅读︰

请注意, filter_var()已经规定只有到 PHP 5.2。如果您希望其使用早期版本的 PHP,您可以使用在 PHP 中使用正则表达式︰

<?php

$pattern = '/^(?!(?:(?:x22?x5C[x00-x7E]x22?)|(?:x22?[^x5Cx22]x22?)){255,})(?!(?:(?:x22?x5C[x00-x7E]x22?)|(?:x22?[^x5Cx22]x22?)){65,}@)(?:(?:[x21x23-x27x2Ax2Bx2Dx2F-x39x3Dx3Fx5E-x7E]+)|(?:x22(?:[x01-x08x0Bx0Cx0E-x1Fx21x23-x5Bx5D-x7F]|(?:x5C[x00-x7F]))*x22))(?:.(?:(?:[x21x23-x27x2Ax2Bx2Dx2F-x39x3Dx3Fx5E-x7E]+)|(?:x22(?:[x01-x08x0Bx0Cx0E-x1Fx21x23-x5Bx5D-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';

$emailaddress = 'test@gmail.com';

if (preg_match($pattern, $emailaddress) === 1) {
    // emailaddress is valid
}

P.S.注意对正则表达式模式使用上面 (从 PHP 源代码中)。它看起来像迈克尔 • Rushton它还有一些版权。所述:"随意使用和重新发布此代码。但请保留此版权通知。

很好,但根据此链接︰ haacked.com/archive/2007/08/21/...用户名称 o 本地部分可以用引号括起来的字符串,但 FILTER_VALIDATE_EMAIL 不接受它。

它不适用于所有的 emailaddresses 所述。此外没有看到我看到某些用引号括起来的字符串执行工作的答案和其他人中失败的测试的列表。

不对,太多失败测试基于该模式emailtester.pieterhordijk.com/test-pattern/MTAz :-)

您需要使用像"preg_match_all"函数通过大文本字符串内的电子邮件的情况下,此模式是极其复杂的。如果您具有简单请共享。我的意思是如果希望︰ preg_match_all ($pattern,$text_string,$matches);然后此复杂模式将重载服务器,如果需要分析大型文本。

@PeeHaa︰ 后缀 3.0 几乎两年现在支持︰ postfix.org/SMTPUTF8_README.html ,并且它包含在 Ubuntu 16.04 并将在下一步的 Debian 版本中,例如包括。Exim 提供了实验支持。像 Gmail 一样的 Webmail 提供商同时也添加了支持发送/接收此类电子邮件,尽管尚不能创建 unicode 帐户。广泛使用和支持是唾手可得,和filter_var将滞后很长时间,即使更改了它现在 (已过帐错误报告)。

为此,可以使用filter_var

<?php
   function validateEmail($email) {
      return filter_var($email, FILTER_VALIDATE_EMAIL);
   }
?>

我认为您可能最好在此特定情况下使用 PHP 的装的过滤器:

它可以返回 true 或 false 时附带的FILTER_VALIDATE_EMAIL参数。

最好的解决方案使用 filter_var:

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $this->addError($attribute, 'you inputted wrong email'); // Or another handler
}
内容来源于Stack Overflow How to validate an email address in PHP
请输入您的翻译

How to validate an email address in PHP

确认取消