Iac*_*opo 8 java apache validation
我需要验证电子邮件和域名.我只需要正式验证,不需要whois或其他形式的域查找.
目前我正在使用apache的commons-validator v1.4.0
不幸的是,我的客户使用新的gTLD,例如DomainValidator类尚不支持的.bike或.productions.有关更多详细信息,请参阅Apache的Jira问题.
我可以轻松地在Maven POM中包含任何声音替代品吗?
如果您不关心国际化地址,您可以更改地址的最后部分,并继续使用Apache公共地址.
这种方法基于以下事实:无论TLD是什么,整个域名的有效性等同于替换TLD的同一域名的有效性com.例如:
abc.def.com已验证.同样abc.def.name,abc.def.xx--kput3i,abc.def.uk是有效的.ab,de.com无效.同样ab,de.name,ab,de.xx-kput3i,ab,de.uk是无效的.所以不要打电话
return EmailValidator.getInstance().isValid(userEmail);
Run Code Online (Sandbox Code Playgroud)
你可以打电话
if ( userEmail == null ) {
return false;
}
return EmailValidator.getInstance().isValid(userEmail.trim().replaceFirst("\\.\\p{Alpha}[\\p{Alnum}-]*\\p{Alnum}$", ".com"));
Run Code Online (Sandbox Code Playgroud)
说明
"\\.\\p{Alpha}[\\p{Alnum}-]*\\p{Alnum}$"检查TLD部分:它位于字符串的末尾(因为$),它以点开头并且不包含其他点,并且符合标准:以ASCII Alpha字符开头,后跟零或更多字母数字或破折号,并以字母数字字符结尾.trim()因为直到现在,如果你使用EmailValidator它,它允许在地址之前和之后的空格.删除空格只会使更换TLD变得更容易,就地址的有效性而言,这一点无关紧要.String.replaceFirst()则会按原样返回.它可能仍然是有效的,因为格式的电子邮件地址x@[n.n.n.n],其中n.n.n.n.一个有效的IP地址是有效的.所以基本上,如果您没有找到顶级域名,您可以EmailValidator自行决定有效性问题.david@galaxy.hoopie-frood将被视为合法,但IANA尚未拥有该TLD.检查域名是相似的,没有trim()部分:
if (userDomain == null ) {
return false;
}
return DomainValidator.getInstance().isValid(userDomain.replaceFirst("\\.\\p{Alpha}[\\p{Alnum}-]*\\p{Alnum}$"));
Run Code Online (Sandbox Code Playgroud)
我也尝试过JavaMail的电子邮件地址验证,但我真的不喜欢它:它允许完全无效的域名,例如net-name.net-(以破折号结尾)或IP地址(不允许电子邮件,不带方括号) ,它只适用于电子邮件地址,而不适用于域名.
如果您需要检查国际化域名和电子邮件,则会有所不同.检查国际化域名(例如??????)很容易.您需要做的就是将它们转换为ASCII java.net.IDN.toASCII()(xn--z4qx76d.xn--zckzah为我的示例域生成 - 这是一个有效的TLD),然后按照我上面的说法进行操作.
国际化的电子邮件是一个不同的故事.如果本地部分是ASCII,则可以将域部分转换为ASCII.如果必须显示电子邮件地址,则需要使用Unicode版本,如果必须发送电子邮件,则使用ASCII版本.
但最近也为国际化的本地部分引入了一个标准,它也允许发送到域名的unicode版本而不首先将其转换为ASCII.无论您是否想要支持,都需要一些思考,因为目前没有多少邮件服务器和邮件传输代理支持它.
| 归档时间: |
|
| 查看次数: |
2724 次 |
| 最近记录: |