如何在javascript中验证电子邮件地址

ecfsfe2w  于 2021-09-13  发布在  Java
关注(0)|答案(23)|浏览(605)

是否有一个正则表达式来验证javascript中的电子邮件地址?

kmb7vmvb

kmb7vmvb1#

所有电子邮件地址都包含“at”(即@)符号。测试必要条件:

email.indexOf("@") > 0

不要为更复杂的事操心。即使你能完全确定一封电子邮件在语法上是否有效,也不能告诉你它是否属于提供它的人。这才是真正重要的。
要测试这一点,请发送验证消息。

tktrz96b

tktrz96b2#

与squirtle不同,这里有一个复杂的解决方案,但它在正确验证电子邮件方面做得非常好

eqqqjvef

eqqqjvef3#

2018年正则表达式更新!试试这个

let val = 'email@domain.com';
if(/^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val)) {
   console.log('passed');
}

脚本版本完成

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val);

更多信息https://git.io/vhefc

pes8fvy9

pes8fvy94#

在验证器函数中使用以下代码:

var emailID = document.forms["formName"]["form element id"].value;
atpos = emailID.indexOf("@");
dotpos = emailID.lastIndexOf(".");
if (atpos < 1 || ( dotpos - atpos < 2 ))
{
    alert("Please enter correct email ID")
    return false;
}

否则可以使用jquery。内部规则定义:

eMailId: {
    required: true,
    email: true
}
o75abkj4

o75abkj45#

不检查tld是否存在的解决方案是不完整的。

几乎所有关于这个问题的答案都建议使用正则表达式来验证电子邮件地址。我认为正则表达式只适用于初步验证。电子邮件地址的检查验证似乎实际上是两个独立的问题:
1-电子邮件格式验证:确保电子邮件是否符合rfc 5322中的电子邮件格式和模式,以及tld是否确实存在。可在此处找到所有有效TLD的列表。
例如,虽然地址 example@example.ccc 将传递正则表达式,它不是有效的电子邮件,因为 ccc 不是iana的顶级域。
2-确保电子邮件确实存在:要做到这一点,唯一的选择是向用户发送电子邮件。

tmb3ates

tmb3ates6#

节点验证程序就是这样做的:

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/
e1xvtsh3

e1xvtsh37#

很难让电子邮件验证程序100%正确。唯一正确的方法是向帐户发送测试电子邮件。这就是说,有一些基本的检查可以帮助确保你得到的东西是合理的。
需要改进的地方有:
而不是新的 RegExp ,试着写下 regexp 这样说:

if (reg.test(/@/))

第二,检查以确保周期在 @ 签名,并确保 @ 时间和周期。

dced5bon

dced5bon8#

只需检查输入的电子邮件地址是否有效或未使用html。

<input type="email"/>

不需要编写函数进行验证。

mrzz3bfm

mrzz3bfm9#

您不应该使用正则表达式验证输入字符串以检查它是否是电子邮件。这太复杂了,不能涵盖所有的情况。
现在,由于您只能涵盖90%的案例,请编写如下内容:

function isPossiblyValidEmail(txt) {
   return txt.length > 5 && txt.indexOf('@')>0;
}

你可以改进它。例如,“aaa@”是有效的。但总的来说,你明白了要点。不要忘乎所以。。。一个简单的90%解决方案比不起作用的100%解决方案要好。
世界需要更简单的代码。。。

x0fgdtte

x0fgdtte10#

我真的很期待解决这个问题。所以我修改了上面的电子邮件验证正则表达式
起初的 /^(([^<>()\[\]\\.,;:\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,}))$/ 被改进的 /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+[^<>()\.,;:\s@\"]{2,})$/ 在维基百科的电子邮件地址中传递示例。
你可以在这里看到结果。

8dtrkrch

8dtrkrch11#

这样做:

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

它基于RFC2822
测试它在https://regex101.com/r/857lzc/1
通常在数据库中存储电子邮件地址时,我会将其设置为小写,实际上,regex通常可以标记为不区分大小写。在这些情况下,时间稍微短一些:

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

下面是一个在javascript中使用的示例(带有不区分大小写的标志 i 最后)。

var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
console.log( emailCheck.test('some.body@domain.co.uk') );

注:
从技术上讲,一些电子邮件可以在邮件前的部分中引用 @ 引号内带有转义字符的符号(因此,您的电子邮件用户可能会令人讨厌,并包含以下内容 @"..." 只要是用引号写的)。从来没有人这样做过!它已经过时了。但是,它包含在真正的rfc 2822标准中,此处省略。
注2:电子邮件的开头(在@符号之前)可以区分大小写(通过规范)。然而,任何有区分大小写电子邮件的人都可能习惯于有问题,而且在实践中,不区分大小写是一个安全的假设。更多信息:电子邮件地址是否区分大小写?
更多信息:http://www.regular-expressions.info/email.html

gpnt7bae

gpnt7bae12#

这是从你家偷来的http://codesnippets.joyent.com/posts/show/1917

email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}
4dbbbstv

4dbbbstv13#

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

function validateEmail(email) {
    const 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(String(email).toLowerCase());
}

下面是接受unicode的常规表达式的示例:

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

但请记住,我们不应该只依赖javascript验证。javascript很容易被禁用。这也应该在服务器端进行验证。
以下是上述措施的一个示例:

function validateEmail(email) {
  const 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() {
  const $result = $("#result");
  const email = $("#email").val();
  $result.text("");

  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;
}

$("#validate").on("click", 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>
ckx4rj1h

ckx4rj1h14#

按照rfcs正确验证电子邮件地址不是单行正则表达式可以实现的。我在php中找到的最好的解决方案是什么是有效的电子邮件地址?。显然,它已经移植到java。我认为该函数太复杂,无法在javascript中移植和使用。javascript/node.js端口:https://www.npmjs.com/package/email-addresses.
一个好的做法是在客户机上验证数据,但在服务器上再次检查验证。考虑到这一点,您可以简单地在客户端上检查字符串是否看起来像有效的电子邮件地址,并在服务器上执行严格的检查。
下面是我用来检查字符串是否像有效邮件地址的javascript函数:

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

说明: lastAtPos < lastDotPos :最后 @ 应该在最后之前 . 自从 @ 不能是服务器名称的一部分(据我所知)。 lastAtPos > 0 :在最后一个电子邮件之前应该有一些内容(电子邮件用户名) @ . str.indexOf('@@') == -1 :应该没有 @@ 在地址里。即使 @ 显示为电子邮件用户名中的最后一个字符,必须引用 " 在这两者之间 @ 最后呢 @ 在地址里。 lastDotPos > 2 :例如,最后一个点前至少应有三个字符 a@b.com . (str.length - lastDotPos) > 2 :最后一个点后应有足够的字符,以形成两个字符的域。我不确定括号是否必要。

atmip9wb

atmip9wb15#

这是正确的rfc822版本。

function checkEmail(emailAddress) {
  var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
  var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
  var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  var sQuotedPair = '\\x5c[\\x00-\\x7f]';
  var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
  var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
  var sDomain_ref = sAtom;
  var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
  var sWord = '(' + sAtom + '|' + sQuotedString + ')';
  var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
  var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
  var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
  var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

  var reValidEmail = new RegExp(sValidEmail);

  return reValidEmail.test(emailAddress);
}

相关问题