是否有正则表达式来验证JavaScript中的电子邮件地址?
@
,;com
等等),并让用户根据需要进行更正(并接受他们发送给我的任何内容)
是否有正则表达式来验证JavaScript中的电子邮件地址?
@
,;com
等等),并让用户根据需要进行更正(并接受他们发送给我的任何内容)
Answers:
使用正则表达式可能是最好的方法。您可以在此处看到大量测试(取自铬)
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>
%2@gmail.com, "%2"@gmail.com, "a..b"@gmail.com, "a_b"@gmail.com, _@gmail.com, 1@gmail.com , 1_example@something.gmail.com
都是有效的,但Gmail绝不允许这些电子邮件地址中的任何一个。您应该通过接受电子邮件地址并向该电子邮件地址发送电子邮件来完成此操作,并提供用户必须访问以确认有效性的代码/链接。
对于需要真正简单验证的人,我对Jaymon的答案做了一些修改:
anystring@anystring.anystring
正则表达式:
/\S+@\S+\.\S+/
JavaScript函数示例:
function validateEmail(email)
{
var re = /\S+@\S+\.\S+/;
return re.test(email);
}
console.log(validateEmail('anystring@anystring.anystring'));
name@again@example.com
。尝试将行粘贴到JavaScript控制台中。我相信您的意图是仅匹配整个文本,这将需要文本“ ^”的开头和文本“ $”的结尾。我正在使用的是/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@again@example.com')
@@@.@
吗?:D
官方标准称为RFC 2822。它描述了有效电子邮件地址必须遵守的语法。你可以(但你不应该 - 阅读)与正则表达式实现:
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\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-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\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)\b
因此,即使遵循官方标准,仍然需要权衡取舍。不要盲目地从在线图书馆或论坛中复制正则表达式。始终根据自己的数据和自己的应用程序对其进行测试。
重点矿
{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_
{|}〜-] +)* @(?:[a-z0-9](?:[a-z0-9 -] * [a-z0-9])?\。)+ [a-z0-9] [a-z0-9-] * [a-z0-9] /
哇,这里有很多复杂性。如果您只想捕捉最明显的语法错误,我将执行以下操作:
^\S+@\S+$
它通常会捕获用户所犯的最明显的错误,并确保表单最正确,这就是JavaScript验证的全部内容。
.+@.+
/\S+@\S+/.test("áéíóúý@ÁÉÍÓÚÝð")
true
在决定使用正则表达式验证电子邮件时,您需要了解一些内容: 这可能不是一个好主意。一旦您对此有所了解,就有许多实现可以使您半途而废,本文对它们进行了很好的总结。
简而言之,唯一可以绝对肯定地确定用户输入的实际上是电子邮件的唯一方法是实际发送电子邮件并查看发生了什么。除此之外,所有这些只是猜测。
name_part@domain_part
和几乎任何东西,包括一@
,是在name_part有效; 该地址foo@bar@machine.subdomain.example.museum
是合法的,尽管必须将其转义为foo\@bar@machine....
。一旦电子邮件到达域(例如“ example.com”),该域就可以“本地”路由邮件,因此可以存在“奇怪的”用户名和主机名。
.us
域名或因为我+
在左边使用了的@
-许多地方已修正这些令人震惊的错误,但当地部分(左@)即可任何域名所有者希望。-> "foo@bar.com"@example.com <-是有效的电子邮件地址。
HTML5本身具有电子邮件验证功能。如果您的浏览器支持HTML5,则可以使用以下代码。
<form><input type="email" placeholder="me@example.com" required>
<input type="submit">
</form>
jsFiddle链接
根据HTML5规范:
一个有效的电子邮件地址是该相匹配的字符串
email = 1*( atext / "." ) "@" label *( "." label ) label = let-dig [ [ ldh-str ] let-dig ] ; limited to a length of 63 characters by RFC 1034 section 3.5 atext = < as defined in RFC 5322 section 3.2.3 > let-dig = < as defined in RFC 1034 section 3.5 > ldh-str = < as defined in RFC 1034 section 3.5 >
此要求是对RFC 5322 的故意违反,它定义了同时太严格(在“ @”字符之前),太模糊(在“ @”字符之后)和太松散(允许注释)的电子邮件地址语法。 ,空白字符和引号引起的字符串(大多数用户不熟悉的方式)在此处具有实际用途。
以下与JavaScript和Perl兼容的正则表达式是上述定义的实现。
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[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])?)*$/
form
标签内并由submit
输入提交,并不是每个人都可以这样做。另外,您不能真正设置错误消息的样式。
user@email
而PHP filter_var
则不接受。这可能会引起问题。
我发现这是最好的解决方案:
/^[^\s@]+@[^\s@]+\.[^\s@]+$/
它允许以下格式:
1. prettyandsimple@example.com 2. very.common@example.com 3.一次性.style.email.with + symbol @ example.com 4. other.email-with-dash@example.com 9. #!$%&'*+-/=?^_`{}|~@example.org 6.“()[]:,; @ \\\”!#$%&'* +-/ =?^ _`{} | 〜.a“ @ example.org 7.“” @ example.org(引号之间的空格) 8.üñîçøðé@example.com(本地使用Unicode字符) 9.üñîçøðé@üñîçøðé.com(域部分中的Unicode字符) 10.Pelé@example.com(拉丁语) 11.δοκιμή@παράδειγμα.δοκιμή(希腊语) 12.我买@屋企。香港(中文) 13.甲斐@黒川。日本(日语) 14.чебурашка@ящик-с-апельсинами.рф(西里尔文)
它显然用途广泛,并允许使用所有重要的国际字符,同时仍强制执行基本的any @@ thing.anything格式。它会阻止RFC在技术上允许的空间,但是它们很少见,我很乐意这样做。
@
为.
(反之亦然)。当然,我们必须在服务器端更加严格。
username@domain.com
,这种模式不起作用
a@b@c@d.x.y.@.z
那么也许他们应该度过一段糟糕的时光?:D
在现代浏览器中,您可以使用纯JavaScript和DOM在@Sushil的答案之上构建:
function validateEmail(value) {
var input = document.createElement('input');
input.type = 'email';
input.required = true;
input.value = value;
return typeof input.checkValidity === 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}
我在小提琴http://jsfiddle.net/boldewyn/2b6d5/中整理了一个示例。与功能检测和Squirtle's Answer的准系统验证相结合,它将您从正则表达式大屠杀中解放出来,并且不会在旧的浏览器上出现问题。
.@a
像true
在当前版本的Chrome,Firefox和Safari中一样进行验证。
这是正确的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);
}
JavaScript可以匹配正则表达式:
emailAddress.match( / some_regex /);
这是电子邮件的RFC22正则表达式:
^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$
(?>
停止回溯并(?<angle><)…(?(angle)>)
避免提供冗长的|
。
所有电子邮件地址都包含一个“ @”符号。测试必要条件:
email.indexOf("@") > 0
不要为更复杂的事情而烦恼。即使您可以完美地确定电子邮件在RFC语法上是否有效,也不会告诉您电子邮件是否属于提供电子邮件的人。那才是真正重要的。
要进行测试,请发送验证消息。
使用单行正则表达式无法正确实现符合RFC的电子邮件地址验证。我在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
:Last @
应该在last之前,.
因为@
不能是服务器名称的一部分(据我所知)。
lastAtPos > 0
:在last之前应该有一些东西(电子邮件用户名)@
。
str.indexOf('@@') == -1
:@@
地址中不应包含任何地址。即使@
显示为电子邮件用户名中的最后一个字符,也必须将其引号引起来,使"
之介于该地址@
和@
地址中的最后一个字符之间。
lastDotPos > 2
:最后一个点之前至少应包含三个字符,例如a@b.com
。
(str.length - lastDotPos) > 2
:最后一个点后应有足够的字符以形成两个字符的域。我不确定是否需要括号。
@
显示为电子邮件用户名中的最后一个字符,也必须将其引号引起"
来,使@
之@
位于该地址和地址中的最后一个字符之间。” 那"@@"@example.com
呢
这是从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;}
.museum
和.travel
域名(由于之后限制为4个字符.
)
{2,4}
值只是一个有用的指标(如“当您看到错误时,其他错误很可能会出现”)。在最基本的一个就是缺乏+
在当地的部分; 此注释框太小,无法指出上面提交的所有错误。
return filter.test(email.value);
呢?
xn--clchc0ea0b2g2a9gcd
)。还是没有问题?
做这个:
[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])?
为什么? 它基于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])?
这是在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') );
注意:
从技术上讲,某些电子邮件可以在@
符号前的部分中加上引号,并在引号内包含转义符(因此,您的电子邮件用户可能很讨厌,@
并且"..."
只要包含在引号中,就可以包含和)。Nobody做到这一点!已经过时了。但是,它包含在真正的RFC 2822标准中,在此省略。
/i
正则表达式末尾的标志。我提到了这样一个事实,即它必须是不区分大小写的比较,但我会更清楚地说明这一点。
我真的很期待解决这个问题。所以我在上面修改了电子邮件验证正则表达式
原版的
/^(([^<>()\[\]\\.,;:\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,})$/
通过Wikipedia电子邮件地址中的示例。
您可以在这里看到结果。
john..doe@example.com
不正确?这是一个有效的特殊情况。
您不应使用正则表达式来验证输入字符串是否为电子邮件。它太复杂了,无法涵盖所有情况。
现在,由于您只能涵盖90%的情况,因此请编写以下内容:
function isPossiblyValidEmail(txt) {
return txt.length > 5 && txt.indexOf('@')>0;
}
您可以对其进行优化。例如,“ aaa @”有效。但总的来说,您的主旨是。并且不要被带走……一个简单的90%解决方案要比不起作用的100%解决方案好。
世界需要更简单的代码...
(.+)@(.*)
做同样的事情,并且更短。
只需使用HTML来检查输入的电子邮件地址是否有效。
<input type="email"/>
无需编写任何函数进行验证。
很难使电子邮件验证程序100%正确。使其正确的唯一真实方法是向该帐户发送测试电子邮件。也就是说,有一些基本的检查可以帮助确保您得到的东西合理。
一些需要改进的地方:
代替new RegExp
,只需尝试regexp
像这样写出:
if (reg.test(/@/))
其次,检查以确保在@
符号后有一个句点,并确保@
s和句点之间有字符。
这是节点验证器的操作方式:
/^(?:[\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])\]))$/
在验证函数中使用以下代码:
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
}
abc@xyz
是您的正则表达式无法识别的完全有效的电子邮件。
abc@tld
是一个有效的电子邮件地址。
正则表达式更新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);
正则表达式,用于验证电子邮件地址
[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兼容的顶级表达式,仅供参考:
/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i
.jobs
。此外,还有实时的IDN(我承认,其中大部分仅在您上任后才正式批准-例如.中國
在2010年6月;但是大多数已经使用了多年)。
显然,就是这样:
/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i
取自10年10月1日http://fightingforalostcause.net/misc/2006/compare-email-regex.php。
但是,当然,这忽略了国际化。
与squirtle相比,这是一个复杂的解决方案,但是在正确验证电子邮件方面做得非常出色:
function isEmail(email) {
return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(email);
}
像这样使用:
if (isEmail('youremail@yourdomain.com')){ console.log('This is email is valid'); }
== true
在示例中使用。
我对正则表达式的了解不是很好。这就是为什么我先使用简单的正则表达式检查常规语法,然后再使用其他函数检查更具体的选项的原因。这可能不是最佳的技术解决方案,但是通过这种方式,我可以变得更加灵活和快捷。
我遇到的最常见错误是空格(尤其是开头和结尾),偶尔还有双点。
function check_email(val){
if(!val.match(/\S+@\S+\.\S+/)){ // Jaymon's / Squirtle's solution
// Do something
return false;
}
if( val.indexOf(' ')!=-1 || val.indexOf('..')!=-1){
// Do something
return false;
}
return true;
}
check_email('check@thiscom'); // Returns false
check_email('check@this..com'); // Returns false
check_email(' check@this.com'); // Returns false
check_email('check@this.com'); // Returns true
<form name="validation" onSubmit="return checkbae()">
Please input a valid email address:<br />
<input type="text" size=18 name="emailcheck">
<input type="submit" value="Submit">
</form>
<script language="JavaScript1.2">
var testresults
function checkemail(){
var str = document.validation.emailcheck.value
var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
if (filter.test(str))
testresults = true
else {
alert("Please input a valid email address!")
testresults = false
}
return (testresults)
}
</script>
<script>
function checkbae(){
if (document.layers || document.getElementById || document.all)
return checkemail()
else
return true
}
</script>
我一直在寻找可通过所有电子邮件地址测试用例的JS正则表达式:
email@example.com
有效的电子邮件
firstname.lastname@example.com
电子邮件在地址字段中包含点
email@subdomain.example.com
电子邮件包含带子域的点
firstname+lastname@example.com
加号被认为是有效字符
email@192.0.2.123
域是有效的IP地址
email@[192.0.2.123]
IP地址周围的方括号被认为是有效的
“email”@example.com
电子邮件周围的报价被认为是有效的
1234567890@example.com
地址中的数字有效
email@domain-one.example
域名中的破折号有效
_______@example.com
地址字段中的下划线有效
email@example.name
.name
有效的顶级域名
email@example.co.jp
顶级域名中的点也被视为有效(co.jp
此处以示例为例)
firstname-lastname@example.com
地址字段中的破折号有效
开始了 :
或正则表达式:
Regex = /(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@[*[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+]*/
Microsoft在ASP.NET MVC中提供的正则表达式为
/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/
如果存在缺陷,我会在此处发布-尽管它始终非常适合我的需求。