summaryrefslogtreecommitdiffstats
path: root/system
diff options
context:
space:
mode:
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);
}
}