【问题标题】:validate.cfc Regular expression help for emailvalidate.cfc 电子邮件正则表达式帮助
【发布时间】:2011-03-27 10:10:12
【问题描述】:

我正在使用 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(以及一年前的另一个错误),但他似乎并未处于错误修复模式。

谁能推荐一个替代的正则表达式?

【问题讨论】:

  • 有趣,isValid("email", xxx) 似乎不符合 RFC。至少是 Railo 的实现。
  • regular-expressions.info/email.html 上有一篇关于各种电子邮件验证 RE 的好文章,讨论了为什么 RFC 仿真可能不是一个好主意。

标签: validation coldfusion email-validation


【解决方案1】:

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

  • 包含“@”
  • 在“@”之前包含 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]$"

【讨论】:

  • 感谢 Adam,让我看看如何添加额外的字符。
【解决方案2】:

这是我典型的电子邮件正则表达式:

^['_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))$

【讨论】:

  • 我还刚刚添加了 'JohnO'Connell@somewhere.com' 作为用户测试,它按预期通过了。
【解决方案3】:

您使用的是什么版本的 CF?从 CF8 开始,您可以使用 IsValid() 来检查电子邮件:

<cfset myemail = "me@exampl.ecom">
<cfoutput>#IsValid("email", myemail)#</cfoutput>

【讨论】:

  • 可以,但是不能达到作者描述的目的,因为isValid不完全兼容RFC。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 2011-12-28
  • 2012-01-02
  • 2015-12-03
相关资源
最近更新 更多