use*_*627 3 javascript regex email-validation internationalization non-ascii-characters
有许多可用于验证电子邮件地址的正则表达式,但其中大多数与非ASCII字符不兼容。电子邮件地址包含非ASCII字符(如“ R ?????? @ ??????????????????????”)后 或“ ??? @ ?????????????。??”,他们无法正确识别。如何构造用于验证电子邮件地址并与非ASCII字符兼容的正则表达式?
根据此消息来源,未通过RegExp类提供任何Unicode支持的JavaScript确实支持\ uFFFF来匹配单个Unicode代码点作为其字符串语法的一部分。
因此,为了定义Unicode字符的匹配项,应创建一组\ uXXXX符号。此处列出的插件允许创建Unicode正则表达式,并且在使用XRegExp JavaScript库时可用于定义Unicode正则表达式。
这是用于测试有效ASCII电子邮件地址的函数:
/**
* Checks if string contains valid email address as described
* in RFC 2822: http://tools.ietf.org/html/rfc2822#section-3.4.1
* This function omits the syntax using double quotes and square brackets
* @return {Boolean} True, if test succeeded.
*/
String.prototype.checkEmail = function()
{
var reEmail = /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
return reEmail.test(this);
}
// Usage example
alert( "some_valid_email@somewhere.com".checkEmail() ); // true
alert( "invalid_email.com".checkEmail() ); // false
Run Code Online (Sandbox Code Playgroud)
为了使其适用于Unicode字符串,可以包含XRegExp库并使用\\p{L}代替a-z。这是完整的代码:
<!DOCTYPE html>
<html>
<head>
<script src="xregexp-all-min.js"></script>
<script>
/**
* Checks if string contains valid email address as described
* in RFC 2822: http://tools.ietf.org/html/rfc2822#section-3.4.1
* This function omits the syntax using double quotes and square brackets
* @return {Boolean} True, if test succeeded.
*/
String.prototype.checkEmailX = function()
{
var reEmail = XRegExp("^[\\p{L}0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[\\p{L}0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?\.)+[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?$");
return reEmail.test(this);
}
alert( "true = " + "R??????@??????????.??????".checkEmailX() ); // true
alert( "true = " +"???@??????????.??".checkEmailX() ); // true
alert( "true = " +"test@test.am".checkEmailX() ); // true
alert( "false = " +"test_test.am".checkEmailX() ); // false
alert( "true = " +"test@???.am".checkEmailX() ); // true
</script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我必须写一些关于如何使用正则表达式验证电子邮件地址的文章。不幸的是,结果是无法通过这种方式验证电子邮件地址。
你当然想知道为什么。
那么我们如何验证电子邮件呢?一种想法是简单地询问给定域的 MTA 是否存在(这在前端无法完成,即使用客户端 JavaScript)。不幸的是,它会带来 DOS 攻击的风险,因此这并不是最好的主意。当然,您不会知道该地址在给定服务器上是否有效。为此,您需要连接到服务器并发出 VRFY 命令,但由于垃圾邮件发送者,大多数服务器会回复“550 No such user”。
如果验证的目的只是为了避免用户的错误,您可能需要添加其他字段并让用户重新输入电子邮件(这也不是最好的主意)。