电子邮件验证javascript
是这个JavaScript函数(checkValidity)正确吗?电子邮件验证javascript
function checkTextBox(textBox)
{
if (!checkValidity(textBox.getValue()))
displayError("Error title", "Error message", textBox);
textBox.focus();
}
function checkValidity(e)
{
var email;
email = "/^[^@][email protected][^@]+.[a-z]{2,}$/i";
if (!e.match(email)){
return false;
else
return true;
}
}
编辑:所有的答案感谢!谢谢!
电子邮件地址在RFC 5322, § 3.4中定义。相关的非终端是addr-spec
。由于领域规范的复杂性和支持陈旧,过时的形式,这个定义变得有些诡异。但是,您可以对大多数表单进行过度逼近:
^[-0-9A-Za-z!#$%&'*+/=?^_`{|}~.][email protected][-0-9A-Za-z!#$%&'*+/=?^_`{|}~.]+
请注意,存在大量的合法字符。大多数reg-exs都会列出错误。是的,所有这些字符在电子邮件地址中都是合法的。
这个正则表达式不匹配一些非常罕见的使用形式,如"noodle soup @ 9"@[what the.example.com]
- 这是一个合法的电子邮件地址!
这种形式似乎工作正常,但它不需要顶级域名。允许名称@电子邮件没有任何.com或其他。我需要添加什么来解决这个问题? – 2013-01-04 19:14:13
也许你想确保至少有一个点?将'\。[ - 0-9A-Za-z!#$%&'* +/=?^ _'{|}〜。] +'加到最后!如果你想忽略国际化的顶级域名,你可以简化为只添加'\。[A-Za-z] +' – MtnViewMark 2013-01-06 07:15:39
我在**点上获得了Visual Studio 2012中'无法识别的转义序列' **之后** '[RegularExpression(“^ [ - 0-9A-Za-z!#$%&'* +/=?^ _ {|}〜。] + @ [ - 0-9A-Za- !ž#$%& '* +/=^_ {|}〜] \ [ - 0-9A-ZA-Z#$%&?!' * +/=^_?{|}〜] {2,4} +“,ErrorMessage =”无效的电子邮件“)]' 任何想法为什么会发生? – 2013-01-07 15:42:50
不。它假定电子邮件地址只能包含一个@
。我建议阅读this article。
您可能也意味着\.
而不是.
。
地址不能包含多个@,除非他们使用的是过时的表单。 – 2010-05-06 19:40:49
@Thom不对。阅读RFC。 – 2010-05-06 19:42:39
实际上,RFC允许@在带引号的字符串内部,它可以在将本地部分与域分开的@之前。所以"[email protected]"@example.com是一个有效的电子邮件地址。 – MtnViewMark 2010-05-06 23:13:56
试试这个:我确定它需要处理各种电子邮件验证。
function checkEmail(email)
{
if(/^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(email)) {
return true;
} else {
return false;
}
}
HTH
我认为你可以放心地忽略几十年来一直没有使用过的某些弃用格式的地址。 – 2010-05-06 19:12:13
RFC 5322§3.4.1定义了电子邮件的地址规范。它不允许这里列出的字符范围。具体而言,它不支持非ASCII字符。 – MtnViewMark 2010-05-06 19:16:25
不,这正则表达式是不是适合这个目的。而不是(但我不能保证它的有效性)。
此外,关于脚本本身,你为什么不检查是这样的:
function checkEmailValidity(e) {
return e.match("some validating regex");
}
这似乎是一个更快,更consise和更具可读性的解决方案。
编辑:
值得一提的,这几乎是不可能的编写一个正则表达式,可以检测到任何有效的电子邮件地址。因此,您可能会更好地尝试制作一些验证算法,而不是正则表达式,因为有效的电子邮件地址可能非常非常复杂。
考虑以下代码:
function validateEmail(email) {
if (typeof email != "string") return false;
email = email.split("@");
email[1] = email[1].split(".");
if (
email.length !== 2 ||
email[1].length < 2 ||
!email[1].hasValues(String)
) return false;
return true;
}
// Checks whether each key in an array has a value, and (optionally) if they match a given contructor (object type).
// I.e.: myArray.hasValues(String) // checks whether all elements in myArray has a value, a nonempty string.
Array.prototype.hasValues = function(assumedConstructor) {
for (var i = 0; i < this.length; i++) {
if (!this[i]) return false;
if (assumedConstructor && this[i].constructor != assumedConstructor) return false;
}
return true;
};
它的工作原理是这样的:
- 首先检查是否字符串包含一个
@
,且只有一个 - 检查该
@
后的部分在至少有一个.
- 检查每个可能的之间是否有一些字符10岁。
它仍然会很容易伪造一个假的电子邮件地址,但这样一来,我们确保它至少莫名其妙格式正确。我能想到的唯一问题是@
的内部注释,根据RFC的说法,这应该是完全合法的,但是这段代码将它视为错误。
正常的互联网用户,其中有正常的电子邮件地址,不会失败。所以它的实际重要性取决于你自己决定;)
最好的解决方案,如果有的话,就是把地址放入一些内置的方法,以某种方式通过尝试使用电子邮件来检查有效性地址。
在引用的文章中的正则表达式是错误的 - 作者只是声称他的电子邮件地址的定义是好的 - 只有它是由RFC定义的,他是错误的。 – MtnViewMark 2010-05-06 19:12:20
我很抱歉参考。我通常不会做正则表达式,所以我不知道。 – 2010-05-06 19:16:12
function isValidEmail($email)
{
return eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email);
};
if(isValidEmail("[email protected]"))
{
echo "valid";
}
else
{
echo "aaa";
};
谁想过在函数声明和if语句之后放置';'? – 2013-02-22 06:38:08
这是一个对应于RFC的正则表达式,不包括过时的表单。我打破它分成组件,以便它会很容易阅读:
IDENT = [a-z0-9](?:[a-z0-9-]*[a-z0-9])?
TEXT = [a-z0-9!#$%&'*+/=?^_`{|}~-]+
EMAIL = TEXT(?:\.TEXT)*@IDENT(?:\.IDENT)+
(注:不区分大小写)
这将不匹配,之前使用引号形式的电子邮件地址@或者是后面的括号形式,但是这些形式是有效的,但它们现在在例子之外几乎没有见过,它们使正则表达式显着复杂化。
验证电子邮件地址是非常困难。除了非常基本的检查@
和.
字符之外,它甚至不值得在客户端进行验证。
Section 3.4.1 of RFC 5322阐述了各种各样的法律角色,你会发现创建一个防弹正则表达式几乎是不可能的。
我最终放弃了验证,因为我偶尔会收到用户的投诉,说他们的疯狂电子邮件地址不起作用。所以,从现在起,我只是试图发送电子邮件,并希望它能够交付。如果发送失败,那么我告诉用户他们的电子邮件地址有问题。
基本上,这个问题的答案应该学习你两件事情: 1)许多人不以为然如何实现它 2)的解决方案,似乎什么东西无处不异常复杂.. 。这可能意味着电子邮件地址的规范已被破坏:) – 2010-05-06 20:34:45