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'Connell@somewhere.com 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?
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]$"
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))$
what version of CF are you using? Since CF8, you can use IsValid() to check against emails:
<cfset myemail = "me@exampl.ecom">
<cfoutput>#IsValid("email", myemail)#</cfoutput>
精彩评论