我正在使用Ryan J. Heldt http://validation.riaforge.org/
的优秀验证CFC但是电子邮件验证RE存在问题。 RFC 5322允许使用以下字符
! # $ % & ' * + - / = ? ^ _ ` { | } ~
然而,由于撇号,validate.cfc中的RE拒绝JohnO'Connell@somewhere.com。
有问题的RE在以下代码块中
<cffunction name="validateEmail" returntype="void" access="private" output="false">
<cfargument name="parameters" type="string" required="true" />
<cfset var rr = 0 />
<cfloop index="rr" list="#arguments.parameters#" delimiters=";">
<cfif isDefined("#listGetAt(rr,1,"|")#") and len(_fields[listGetAt(rr,1,"|")]) and not reFind("^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$",_fields[listGetAt(rr,1,"|")])>
<cfset registerError(listGetAt(rr,1,"|"),listGetAt(rr,2,"|")) />
</cfif>
</cfloop>
<cfreturn />
</cffunction>
我对RE的了解并不是建议一个解决方案,虽然我已经通知Ryan这个(以及一年前的另一个错误)但他似乎并没有处于bug修复模式。
有人可以建议另类正则表达吗?
答案 0 :(得分:1)
我会尝试更新RegEx以允许名称中包含这些特殊字符,但作为一般经验法则,我对电子邮件地址的验证非常松散;因为貌似 nobody 根据规范实现它们。我的验证通常包括:
虽然这可以避免许多误报,但也不会产生任何误报。
我不会尝试将该正则表达式更新为规范,因为它远不够复杂到足以完全符合规范。如果您只想在名称中允许使用特殊字符,请使用:
and not reFind("^[a-zA-Z][\w\.\##\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$"
答案 1 :(得分:1)
这是我对电子邮件的典型正则表达式:
^['_a-zA-Z0-9-\+~]+(\.['_a-zA-Z0-9-\+~]+)*@([a-zA-Z_0-9-]+\.)+(([a-zA-Z]{2})|(aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel))$
答案 2 :(得分:0)
您使用的是什么版本的CF?从CF8开始,您可以使用IsValid()来检查电子邮件:
<cfset myemail = "me@exampl.ecom">
<cfoutput>#IsValid("email", myemail)#</cfoutput>