diff --git a/include/class.validator.php b/include/class.validator.php index 62ce6815345bb754a9d260211b1585f42e7c836d..74e13f983a44994f6a86594735b9dd2d2c115a74 100644 --- a/include/class.validator.php +++ b/include/class.validator.php @@ -137,7 +137,8 @@ class Validator { /*** Functions below can be called directly without class instance. Validator::func(var..); (nolint) ***/ function is_email($email) { - return preg_match('/^([*+!.&#$|\'\\%\/0-9a-z^_`{}=?~:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i',$email); + require_once PEAR_DIR.'Mail/RFC822.php'; + return !PEAR::isError(Mail_RFC822::parseAddressList($email)); } function is_phone($phone) { /* We're not really validating the phone number but just making sure it doesn't contain illegal chars and of acceptable len */ diff --git a/setup/test/tests/test.validation.php b/setup/test/tests/test.validation.php index 942767329642101c1f6db4a483ff23798936c118..20b1eae9aa85cf36a9355de41c468feb74e5e6a1 100644 --- a/setup/test/tests/test.validation.php +++ b/setup/test/tests/test.validation.php @@ -15,6 +15,39 @@ class TestValidation extends Test { $this->assert(Validator::is_username('ä¸å›½æœŸåˆŠå…¨æ–‡æ•°æ®')); // Non-letters $this->assert(!Validator::is_username('j®red')); + // Special chars + $this->assert(Validator::is_username('jar.ed')); + $this->assert(Validator::is_username('jar_ed')); + $this->assert(Validator::is_username('jar-ed')); + // Illegals + $this->assert(!Validator::is_username('j red')); + $this->assert(!Validator::is_username('jared ')); + $this->assert(!Validator::is_username(' jared')); + } + + function testValidEmail() { + // Common emails + $this->assert(Validator::is_email('jared@domain.tld')); + $this->assert(Validator::is_email('jared12@domain.tld')); + $this->assert(Validator::is_email('jared.12@domain.tld')); + $this->assert(Validator::is_email('jared_12@domain.tld')); + $this->assert(Validator::is_email('jared-12@domain.tld')); + + // Very likely illegal + $this->assert(!Validator::is_email('jared r@domain.tld')); + $this->assert(Validator::is_email('jared@host')); + + // Odd cases, but legal + $this->assert(Validator::is_email('jared@[127.0.0.1]')); + $this->assert(Validator::is_email('jared@[ipv6:::1]')); + $this->assert(Validator::is_email('*@domain.tld')); + $this->assert(Validator::is_email("'@domain.tld")); + $this->assert(Validator::is_email('"jared r"@domain.tld')); + + // RFC 6530 + #$this->assert(Validator::is_email('Pelé@example.com')); + #$this->assert(Validator::is_email('δοκιμή@παÏάδειγμα.δοκιμή')); + #$this->assert(Validator::is_email('甲æ–@é»’å·.日本')); } } return 'TestValidation';