Saul
Saul

Reputation: 1397

validate.cfc Regular expression help for email

I'm using the excellent validate CFC by Ryan J. Heldt http://validation.riaforge.org/

but have a problem with the email validation RE. RFC 5322 allows the following characters

! # $ % & ' * + - / = ? ^ _ ` { | } ~

however the RE in validate.cfc rejects JohnO'[email protected] because of the apostrophe.

The RE in question is in the following code block

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

my knowledge of RE's is not up to suggesting a solution, and although I have notified Ryan about this (and another bug a year ago) he doesn't seem to be in bug fixing mode.

Can anyone suggest an alternative regular expression please?

Upvotes: 2

Views: 547

Answers (3)

rip747
rip747

Reputation: 9443

what version of CF are you using? Since CF8, you can use IsValid() to check against emails:

<cfset myemail = "[email protected]">
<cfoutput>#IsValid("email", myemail)#</cfoutput>

Upvotes: 0

Edward M Smith
Edward M Smith

Reputation: 10627

This is my typical regex for emails:

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

Upvotes: 1

Adam Tuttle
Adam Tuttle

Reputation: 19824

I'll take a stab at updating the RegEx to allow those special characters in the name, but as a general rule of thumb I have very loose validation on email addresses; because seemingly nobody implements them according to spec. My validation usually consists of:

  • contains '@'
  • contains 1+ characters before '@'
  • contains 3+ characters after '@'
  • 1+ characters after '@' must be '.'

While this allows for a lot of false positives to slip through, it also won't create any false negatives.

I'm not going to try to update that regex to spec as it's nowhere near complex enough to match the spec exactly. If you just want to allow special characters in the name, then use this:

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]$"

Upvotes: 1

Related Questions