summaryrefslogtreecommitdiffstats
path: root/system
diff options
context:
space:
mode:
authorTimothy Warren <tim@timshomepage.net>2012-05-03 20:05:00 +0200
committerTimothy Warren <tim@timshomepage.net>2012-05-03 20:05:00 +0200
commit6986479050e7bf02cbafd9dbc82640a9e3865bb9 (patch)
treec63313e1584934debe4ff1bd1cd1f455c5121c20 /system
parent87a4b544da246f10086129da9c5e48e27ee47810 (diff)
Make valid_email helper function more accurate
Diffstat (limited to 'system')
-rw-r--r--system/helpers/email_helper.php32
1 files changed, 30 insertions, 2 deletions
diff --git a/system/helpers/email_helper.php b/system/helpers/email_helper.php
index 0516e938a..c7b3abada 100644
--- a/system/helpers/email_helper.php
+++ b/system/helpers/email_helper.php
@@ -42,12 +42,40 @@ if ( ! function_exists('valid_email'))
/**
* Validate email address
*
+ * Updated to be more accurate to RFC822
+ * see: http://www.iamcal.com/publish/articles/php/parsing_email/
+ *
* @param string
* @return bool
*/
- function valid_email($address)
+ function valid_email($email)
{
- return (bool) preg_match('/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix', $address);
+ $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
+
+ $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
+
+ $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c'.
+ '\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
+
+ $quoted_pair = '\\x5c[\\x00-\\x7f]';
+
+ $domain_literal = "\\x5b({$dtext}|{$quoted_pair})*\\x5d";
+
+ $quoted_string = "\\x22({$qtext}|{$quoted_pair})*\\x22";
+
+ $domain_ref = $atom;
+
+ $sub_domain = "({$domain_ref}|{$domain_literal})";
+
+ $word = "({$atom}|{$quoted_string})";
+
+ $domain = "{$sub_domain}(\\x2e{$sub_domain})*";
+
+ $local_part = "{$word}(\\x2e{$word})*";
+
+ $addr_spec = "{$local_part}\\x40{$domain}";
+
+ return (bool) preg_match("!^{$addr_spec}$!", $email);
}
}