validate.cfc电子邮件的正则表达式帮助

时间:2010-08-09 17:07:17

标签: validation coldfusion email-validation

我正在使用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修复模式。

有人可以建议另类正则表达吗?

3 个答案:

答案 0 :(得分:1)

我会尝试更新RegEx以允许名称中包含这些特殊字符,但作为一般经验法则,我对电子邮件地址的验证非常松散;因为貌似 nobody 根据规范实现它们。我的验证通常包括:

  • 包含'@'
  • 在'@'
  • 之前包含1个以上的字符
  • 在'@'
  • 之后包含3个以上的字符
  • '@'后的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]$"

答案 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>