在 JavaScript 中,电子邮件地址验证的方式是?

2008-09-20 15:00:47
问题评论:

回答问题展开测试/我的电子邮件正则表达式一个距离应采用电子邮件地址验证?无法方便地改编的 JavaScript

尽管此解决方案可能是简单的我敢肯定这是那些有用的事情之一,人将为 Googling 和值得自己网站上的条目如果只是 Google 会:) 查找的第一个地方只需看此关闭每一段时间的重复项。

我敢肯定这是一个人将会为 Googling 这些有用事物的lol,作为一种事实,即是如何我只是在这一问题 !

可能的重复项的最佳的正则表达式用于验证电子邮件地址是什么?

请获得此权限,太多的网站是更喜欢我的"firstName@secondName.name"的电子邮件地址,并不是所有的顶级域结束 2 个或 3 个字母。

回答:

使用正则表达式可能是最好的方法。您可以看到测试的一组在这里(取自六价铬)

function validateEmail(email) {
    var re = /^(([^<>()[].,;:s@"]+(.[^<>()[].,;:s@"]+)*)|(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$/;
    return re.test(email);
}

以下是接受 unicode 的正则表达式的示例︰

var re = /^(([^<>()[].,;:s@"]+(.[^<>()[].,;:s@"]+)*)|(".+"))@(([^<>()[].,;:s@"]+.)+[^<>()[].,;:s@"]{2,})$/i;

但请注意,不应只在 JavaScript 验证依赖于一个。可以轻松地禁用 JavaScript。应该在服务器端也对此进行了验证。

以下是上述操作中的示例︰

function validateEmail(email) {
  var re = /^(([^<>()[].,;:s@"]+(.[^<>()[].,;:s@"]+)*)|(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$/;
  return re.test(email);
}

function validate() {
  $("#result").text("");
  var email = $("#email").val();
  if (validateEmail(email)) {
    $("#result").text(email + " is valid :)");
    $("#result").css("color", "green");
  } else {
    $("#result").text(email + " is not valid :(");
    $("#result").css("color", "red");
  }
  return false;
}

$("form").bind("submit", validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>

此正则表达式可以消除有效、 使用中的电子邮件。不要使用。Google 的"RFC822"或"RFC2822",以获取正确的正则表达式。

@Randall︰ 您能否举例说明这不允许通过电子邮件地址吗?

-1,您将永远不会匹配正则表达式的所有有效的电子邮件地址

我只是尝试发送电子邮件告诉他/她有一个很酷的电子邮件地址的 n@ai @GoodPerson。但是,唉,gmail 就不让我来。我可疑人,是具有更大的问题,通过比只是我的站点的 javascript 验证电子邮件与他人沟通 !但感谢上升到所面临的挑战。

所有评论这"足够好"的人︰ 看起来,您只需考虑此问题错误。没关系。它是为您的用户可以进行的选择。东西我没在它疯狂。但是,您知道,从技术角度讲,您是 demonstratively,证明为错误。

只是为了完整起见,下面是另一个 RFC 2822 符合正则表达式

RFC 2822就是官方的标准。它描述了有效的电子邮件地址必须遵守的语法。您可以 (但不能— —自学) 使用此正则表达式实现它︰

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[x01-x08x0bx0cx0e-x1fx21x23-x5bx5d-x7f]|[x01-x09x0bx0cx0e-x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[x01-x08x0bx0cx0e-x1fx21-x5ax53-x7f]|[x01-x09x0bx0cx0e-x7f])+)])

(...)如果我们忽略使用双引号和方括号语法,我们得到的 RFC 2822 更实用的实现。仍将今天匹配的所有电子邮件地址,在实际使用中的 99.99%。

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

您可以进行进一步更改是允许任何两个字母的国家代码顶级域,并且只有特定泛型的顶级域。此虚拟像asdf@adsf.adsf一样的电子邮件地址的正则表达式筛选器将需要添加新的顶级域时对其进行更新.

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)

因此,即使按照官方的标准,仍有利弊进行。不盲目地将正则表达式复制从联机库或论坛。一定要在您自己的数据与您自己的应用程序测试他们。

强调地雷

NB:"在实际使用今天"可能已经有效时的代码编写,回 200 x 中。代码可能保留在该特定年份之外的使用。(如果我有一枚一角硬币,为每个"meh,以往任何时候都没有一个会使用 4 +-除了那些特定的字母 TLD"我必须要解决,我会;)) 角世界铜和镍市场

对于 RFC 2822 的实际实现,结束应修改稍有以防止单个字符域扩展。/[a-z0-9!#$%& * + =? ^ _{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_{|}~-]+)*@(?:[a-z0-9](?‌​: [a-z0-9-]*[a-z0-9])?.)+[a-z0-9][a-z0-9-]*[a-z0-9]/

此外,第一部分应 (?: [A-z 与大写 A 以避免漏报,当用户将其电子邮件地址设置为大写。

使用"实际实现",遇到了在 Safari 的问题︰ 如果@后匹配的地址的部分是 32 个字符或长的正则表达式测试将会失败。这是因为这一限制的易于使用的功能分析器︰ github.com/WebKit/webkit/blob/master/Source/JavaScriptCore/...请注意这只是这种情况,如下所示定义正则表达式时︰ var email_re = new RegExp("[a-z ...0-9])?", "i");(而不是var email_re = new RegExp(/[a-z ...0-9])?/i);添加额外转义` before each 。 还解决了问题。++@Cal 用于建议此解决方案 !

使用说明书中, d._.___d@gmail.com不是一个有效的电子邮件,但这仍会检测是正确的一

我稍微修改了非常简单的形式验证的用户的 Jaymon 的答案︰

anystring@anystring.anystring

正则表达式︰

/S+@S+.S+/

示例 JavaScript 函数︰

function validateEmail(email) 
{
    var re = /S+@S+.S+/;
    return re.test(email);
}

/S+@S+.S+/.test('name@again@example.com') true

@neoascetic Shazam !/[^s@]+@[^s@]+.[^s@]+/.test('name@again@example.com') // false

您可以实现一些 20 x 相当可能会导致一些用户的问题,可能不是有效的在将来,或者您可以抓取 ImmortalFirefly 的版本,以确保至少将他们放在努力使其看起来真实。这取决于您的应用程序可能会更有可能要碰到过有人会悲伤因为不接受其非常规的电子邮件,而不是人导致通过输入电子邮件地址真的不存在 (这可以做些仍由输入 100%有效的 RFC2822 电子邮件地址,但使用的是未注册的用户名或域)。Upvoted !

实际上,@ImmortalFirefly,您提供的正则表达式将匹配name@again@example.com请将您的行粘贴到 JavaScript 控制台上。我认为您的意图是只匹配整个文本,文本的开头需要 ' ^' 和结束文本 $ 运算符。我使用的是/^[^s@]+@[^s@]+.[^s@]+$/.test('name@again@example.com')

基于在此验证此电子邮件是有效︰ check@this.com

您需要了解您决定使用一个正则表达式来验证电子邮件的第二个的东西︰它是可能不是个好主意一旦您已进入这样的条款,有很多那里的实现可以助您实现一半目标,这篇文章概括这些良好。

简单地说,不过,唯一的方法,以确保完全、 有效,用户输入的内容实际上是在一封电子邮件是实际发送一封电子邮件,看看效果。不是所有的只是猜测。

为何我要花费我的时间来验证电子邮件地址,甚至无法通过正则表达式控制-1 吗?

我只是做不在于 regex 是个好主意,只是猜测的 @PaoloBergantino。正则表达式无效地址是无效的地址的 100%。

@kommradHomer-"regex 无效"地址是几乎总是有效的因为任何正则表达式用于验证电子邮件地址是几乎可以肯定错误并且排除有效的电子邮件地址。电子邮件地址是name_part@domain_part ,几乎任何字符,包括 @,是无效的 name_part;虽然它必须转义为foo@bar@machine....,是合法的地址foo@bar@machine.subdomain.example.museum一旦电子邮件到达域如 'example.com 域可以将邮件路由"本地"以便"奇怪"的用户名和主机名可以存在。

stackoverflow.com/a/1373724/69697的 voyager 的答案中第二个正则表达式是实际的使用,并且应具有几乎没有漏报。为什么我同意 @kommradHomer 这里-发送电子邮件,如果您没有?我可以理解为不能理解 regexes 身不喜欢并希望保持代码简单,但这是几行代码,通过立即出绝对无效的项定时可以节省您的服务器很多麻烦。自己的正则表达式是无用的但作为对 serverside 验证的很好补充。

我承认"几乎总是有效的"@dmur 则可能过分夸大它,但我必须拒绝通过网站很多,只是因为我有.us域或许多地方因为我用左边的@ - +具有固定这些 egregious 错误,但本地部分我 (完全有效和工作) 的电子邮件地址 (左边的 @) 可以是任何域所有者希望。-"foo@bar.com"@example.com-> <-是一个有效的电子邮件地址。

哇,有很多这里的复杂性。如果要做的就是只捕获最明显的语法错误,我将做如下所示︰

S+@S+

它通常捕获最明显的错误,用户进行并确保窗体是大多数情况下右,即验证是所有关于什么 JavaScript。

+ 1 为发送电子邮件并查看发生了什么是确保只有真正的方式来验证电子邮件地址,就不需要与多个简单的正则表达式相匹配。

仍可以保持它简单,但做一些更多以确保它具有"。"某处后 @ 跟唯一数字或数字,所以,像 me@here,me@here @,和 me@herecom 不是有效...^ S+@S+ [.][0-9a-z] + $

我认为电子邮件地址可以包含空格。可能,最好使用.+@.+

/S+@S+/.test("áéíóúý@ÁÉÍÓÚÝð")true

@gtournie 无人关注。没有人将要输入的电子邮件域的事故,和就所有前端验证︰ 以防止人们意外地在电子邮件字段中输入了错误的信息,例如他们的姓名,位。

内容来源于Stack Overflow Validate email address in JavaScript?
请输入您的翻译

Validate email address in JavaScript?

确认取消