这个 JavaScript 函数(checkValidity)正确吗?
function checkTextBox(textBox)
{
if (!checkValidity(textBox.getValue()))
displayError("Error title", "Error message", textBox);
textBox.focus();
}
function checkValidity(e)
{
var email;
email = "/^[^@]+@[^@]+.[a-z]{2,}$/i";
if (!e.match(email)){
return false;
else
return true;
}
}
编辑:所有答案都很感谢!谢谢!
电子邮件地址在 RFC 5322, § 3.4 中定义。相关的非终结符是
addr-spec
。由于领域规范的复杂性和对旧的、过时的形式的支持,这个定义被证明有些奇怪。但是,您可以使用以下方法对大多数形式进行过度近似:
^[-0-9A-Za-z!#$%&'*+/=?^_`{|}~.]+@[-0-9A-Za-z!#$%&'*+/=?^_`{|}~.]+
请注意,有大量合法字符。大多数正则表达式的列表都是错误的。是的,电子邮件地址中的所有这些字符都是合法的。
此正则表达式不会匹配一些非常不常用的形式,例如
"noodle soup @ 9"@[what the.example.com]
——这是一个合法的电子邮件地址!
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";
};
不,正则表达式不太适合这个目的。 看看这个(虽然我不能保证它的有效性)。
另外,关于脚本本身,你为什么不这样检查:
function checkEmailValidity(e) {
return e.match("some validating regex");
}
这似乎是一个更快、更简洁、更易读的解决方案。
编辑:
值得注意的是,编写可以检测任何有效电子邮件地址的正则表达式几乎是不可能的。因此,您可能最好尝试制定一些验证算法,而不是正则表达式,因为有效的电子邮件地址可能非常非常复杂。
考虑这段代码:
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;
};
它的工作原理是这样的:
@
,并且只有一个@
之后的部分是否至少有一个 .
.
之间是否存在一些字符。伪造假电子邮件地址仍然很容易,但这样我们就可以确保它至少以某种方式格式正确。我能想到的唯一问题是
@
的内部注释,根据 RFC,这应该是完全合法的,但此代码会将其视为错误。最好的解决方案(如果有的话)是将地址放入某种内置方法中,该方法通过尝试使用电子邮件地址以某种方式检查有效性。
试试这个:我确信它可以处理各种电子邮件验证。
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
这是与 RFC 相对应的正则表达式,也排除了过时的形式。我已将其分解为多个组件,以便于阅读:
IDENT = [a-z0-9](?:[a-z0-9-]*[a-z0-9])?
TEXT = [a-z0-9!#$%&'*+/=?^_`{|}~-]+
EMAIL = TEXT(?:\.TEXT)*@IDENT(?:\.IDENT)+
(注意:不区分大小写。)
这不会匹配在@之前使用引号形式或在@之后使用方括号形式的电子邮件地址,但是虽然这些形式有效,但如今除了示例之外几乎看不到它们,并且它们使正则表达式显着复杂化。
验证电子邮件地址非常困难。除了对
@
和 .
字符进行非常基本的检查之外,甚至不值得在客户端进行验证。
RFC 5322第 3.4.1 节详细阐述了各种法律字符,您会发现创建防弹正则表达式几乎是不可能的。
我最终放弃了验证,因为我偶尔会收到用户的投诉,说他们疯狂的电子邮件地址不起作用。所以,从现在开始,我只是尝试发送电子邮件并希望它能送达。如果发送失败,我会告诉用户他们的电子邮件地址有问题。
在进行几次搜索时,我发现了这一点。它基于 RFC 2822
函数 validateEmail(id) { 让 emailField = document.querySelector(
#${id}
);
让电子邮件 = emailField.value.trim();
if (email === "") {
errors.push(`Het veld ${id} is vereist.`);
} else {
// Use a regular expression to check the email format
let emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
errors.push(`Ongeldig e-mailadres. Controleer het veld ${id}.`);
}
}
}