From 1d06fda799c54a12f640c56ef521615035bde97c Mon Sep 17 00:00:00 2001 From: Anowar Hosen <85840896+MdAnowarHosen@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:07:33 +0600 Subject: [PATCH 1/8] Str::isEmail() added check the email is valid or not using Str::isEmail() --- src/Illuminate/Support/Str.php | 18 ++++++++++++++++++ tests/Support/SupportStrTest.php | 28 ++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/Illuminate/Support/Str.php b/src/Illuminate/Support/Str.php index ee1547d4f002..fc898cdb5583 100644 --- a/src/Illuminate/Support/Str.php +++ b/src/Illuminate/Support/Str.php @@ -2011,6 +2011,24 @@ public static function freezeUlids(?Closure $callback = null) return $ulid; } + /** + * Determine if a given value is a valid Email. + * + * @param mixed $value + * @return bool + */ + public static function isEmail($value) + { + + if (!is_string($value) || filter_var($value, FILTER_VALIDATE_EMAIL) === false) + { + return false; + } + + $tld = substr(strrchr($value, '.'), 1); + return strlen($tld) >= 2; + } + /** * Remove all strings from the casing caches. * diff --git a/tests/Support/SupportStrTest.php b/tests/Support/SupportStrTest.php index 9f930a73250d..52b60bf562e0 100755 --- a/tests/Support/SupportStrTest.php +++ b/tests/Support/SupportStrTest.php @@ -1637,6 +1637,34 @@ public function testChopEnd() $this->assertSame($expected, Str::chopEnd($subject, $needle)); } } + + public function testIsEmail() + { + // Valid email cases + $this->assertTrue(Str::isEmail('example@laravel.com')); + $this->assertTrue(Str::isEmail('user.name+alias@domain.co.uk')); + $this->assertTrue(Str::isEmail('123456@domain.com')); + $this->assertTrue(Str::isEmail('user@sub.domain.com')); + $this->assertTrue(Str::isEmail('a@b.co')); + $this->assertTrue(Str::isEmail('user@domain.org')); + + // Invalid email cases + $this->assertFalse(Str::isEmail('example.laravel.com')); + $this->assertFalse(Str::isEmail('example@laravel')); + $this->assertFalse(Str::isEmail('example@.com')); + $this->assertFalse(Str::isEmail('example@com.')); + $this->assertFalse(Str::isEmail('example@domain..com')); + $this->assertFalse(Str::isEmail(' example@laravel.com ')); + $this->assertFalse(Str::isEmail('@domain.com')); + $this->assertFalse(Str::isEmail('example@domain.com@another.com')); + $this->assertFalse(Str::isEmail('example@domain.c')); + $this->assertFalse(Str::isEmail('example@domain.com.')); + $this->assertFalse(Str::isEmail('example@domain#com')); + $this->assertFalse(Str::isEmail('example@domain.com!')); + $this->assertFalse(Str::isEmail('example@domain.com@com')); + $this->assertFalse(Str::isEmail('user@sub.-domain.com')); + $this->assertFalse(Str::isEmail('user@subdomain.com.')); + } } class StringableObjectStub From aa8d03b5049b8d0281cbfc5abf06deed3b6c0e59 Mon Sep 17 00:00:00 2001 From: Anowar Hosen <85840896+MdAnowarHosen@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:19:33 +0600 Subject: [PATCH 2/8] whitespace removed --- src/Illuminate/Support/Str.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Illuminate/Support/Str.php b/src/Illuminate/Support/Str.php index fc898cdb5583..1ac88dd96722 100644 --- a/src/Illuminate/Support/Str.php +++ b/src/Illuminate/Support/Str.php @@ -2020,8 +2020,7 @@ public static function freezeUlids(?Closure $callback = null) public static function isEmail($value) { - if (!is_string($value) || filter_var($value, FILTER_VALIDATE_EMAIL) === false) - { + if (!is_string($value) || filter_var($value, FILTER_VALIDATE_EMAIL) === false){ return false; } From c19958fdb16b8884b718d46bfbe3fd351a2e88a9 Mon Sep 17 00:00:00 2001 From: Anowar Hosen <85840896+MdAnowarHosen@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:21:40 +0600 Subject: [PATCH 3/8] whitespace remove from Str::isEmail() --- src/Illuminate/Support/Str.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Support/Str.php b/src/Illuminate/Support/Str.php index 1ac88dd96722..34bf33dda083 100644 --- a/src/Illuminate/Support/Str.php +++ b/src/Illuminate/Support/Str.php @@ -2020,7 +2020,7 @@ public static function freezeUlids(?Closure $callback = null) public static function isEmail($value) { - if (!is_string($value) || filter_var($value, FILTER_VALIDATE_EMAIL) === false){ + if (! is_string($value) || filter_var($value, FILTER_VALIDATE_EMAIL) === false) { return false; } From 8077e9160bf1e0d3f5d8488129bb91cd9c2a8c3d Mon Sep 17 00:00:00 2001 From: Anowar Hosen <85840896+MdAnowarHosen@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:26:45 +0600 Subject: [PATCH 4/8] Update Str.php --- src/Illuminate/Support/Str.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Support/Str.php b/src/Illuminate/Support/Str.php index 34bf33dda083..be95f5989d61 100644 --- a/src/Illuminate/Support/Str.php +++ b/src/Illuminate/Support/Str.php @@ -2019,12 +2019,12 @@ public static function freezeUlids(?Closure $callback = null) */ public static function isEmail($value) { - if (! is_string($value) || filter_var($value, FILTER_VALIDATE_EMAIL) === false) { return false; } $tld = substr(strrchr($value, '.'), 1); + return strlen($tld) >= 2; } From 4dd2dd0ffd9b2ce1b05f4eddcc808001cecceada Mon Sep 17 00:00:00 2001 From: Anowar Hosen <85840896+MdAnowarHosen@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:29:20 +0600 Subject: [PATCH 5/8] using egulias/EmailValidator to check email validate or not using egulias/EmailValidator to check email validate or not --- src/Illuminate/Support/Str.php | 13 +++----- tests/Support/SupportStrTest.php | 56 +++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/Illuminate/Support/Str.php b/src/Illuminate/Support/Str.php index be95f5989d61..28372b3e458c 100644 --- a/src/Illuminate/Support/Str.php +++ b/src/Illuminate/Support/Str.php @@ -18,6 +18,8 @@ use Throwable; use Traversable; use voku\helper\ASCII; +use Egulias\EmailValidator\EmailValidator; +use Egulias\EmailValidator\Validation\RFCValidation; class Str { @@ -2017,15 +2019,10 @@ public static function freezeUlids(?Closure $callback = null) * @param mixed $value * @return bool */ - public static function isEmail($value) + public static function isEmail(string $value): bool { - if (! is_string($value) || filter_var($value, FILTER_VALIDATE_EMAIL) === false) { - return false; - } - - $tld = substr(strrchr($value, '.'), 1); - - return strlen($tld) >= 2; + $validator = new EmailValidator(); + return $validator->isValid($value, new RFCValidation()); } /** diff --git a/tests/Support/SupportStrTest.php b/tests/Support/SupportStrTest.php index 52b60bf562e0..08f351ae2898 100755 --- a/tests/Support/SupportStrTest.php +++ b/tests/Support/SupportStrTest.php @@ -1638,33 +1638,51 @@ public function testChopEnd() } } - public function testIsEmail() + public function testValidEmails() { - // Valid email cases + // Standard valid email formats according to RFC 5322 $this->assertTrue(Str::isEmail('example@laravel.com')); $this->assertTrue(Str::isEmail('user.name+alias@domain.co.uk')); $this->assertTrue(Str::isEmail('123456@domain.com')); $this->assertTrue(Str::isEmail('user@sub.domain.com')); $this->assertTrue(Str::isEmail('a@b.co')); $this->assertTrue(Str::isEmail('user@domain.org')); - - // Invalid email cases - $this->assertFalse(Str::isEmail('example.laravel.com')); - $this->assertFalse(Str::isEmail('example@laravel')); - $this->assertFalse(Str::isEmail('example@.com')); - $this->assertFalse(Str::isEmail('example@com.')); - $this->assertFalse(Str::isEmail('example@domain..com')); - $this->assertFalse(Str::isEmail(' example@laravel.com ')); - $this->assertFalse(Str::isEmail('@domain.com')); - $this->assertFalse(Str::isEmail('example@domain.com@another.com')); - $this->assertFalse(Str::isEmail('example@domain.c')); - $this->assertFalse(Str::isEmail('example@domain.com.')); - $this->assertFalse(Str::isEmail('example@domain#com')); - $this->assertFalse(Str::isEmail('example@domain.com!')); - $this->assertFalse(Str::isEmail('example@domain.com@com')); - $this->assertFalse(Str::isEmail('user@sub.-domain.com')); - $this->assertFalse(Str::isEmail('user@subdomain.com.')); + $this->assertTrue(Str::isEmail('user_name@domain.com')); + $this->assertTrue(Str::isEmail('user-name@domain.io')); + $this->assertTrue(Str::isEmail('user@localhost')); + $this->assertTrue(Str::isEmail('user@123.123.123.123')); + $this->assertTrue(Str::isEmail('"user@name"@example.com')); + $this->assertTrue(Str::isEmail('"john.doe"@example.com')); + $this->assertTrue(Str::isEmail('very.common@example.com')); + $this->assertTrue(Str::isEmail('disposable.style.email.with+symbol@example.com')); + $this->assertTrue(Str::isEmail('user@domain.toolongtld')); + $this->assertTrue(Str::isEmail('user@domain.c')); + $this->assertTrue(Str::isEmail('user@[192.168.1.1]')); + + $this->assertFalse(Str::isEmail('plainaddress')); + $this->assertFalse(Str::isEmail('@missinglocal.com')); + $this->assertFalse(Str::isEmail('username@.com')); + $this->assertFalse(Str::isEmail('username@com.')); + $this->assertFalse(Str::isEmail('username@domain..com')); + $this->assertFalse(Str::isEmail('user@domain,com')); + $this->assertFalse(Str::isEmail('user@domain@another.com')); + $this->assertFalse(Str::isEmail('username@-domain.com')); + $this->assertFalse(Str::isEmail('username@domain-.com')); + $this->assertFalse(Str::isEmail('user@domain.com ')); + $this->assertFalse(Str::isEmail(' user@domain.com')); + $this->assertFalse(Str::isEmail('username@domain.com#')); + $this->assertFalse(Str::isEmail('username@domain..com')); + $this->assertFalse(Str::isEmail('user@sub..domain.com')); + $this->assertFalse(Str::isEmail('user@.com')); + $this->assertFalse(Str::isEmail('"user@name"@example..com')); + $this->assertFalse(Str::isEmail('user.@domain.com')); + $this->assertFalse(Str::isEmail('user..name@domain.com')); + $this->assertFalse(Str::isEmail('user@sub_domain.com')); + } + + + } class StringableObjectStub From b41038be6ad83a3a86e29f298eafe34b4beb1817 Mon Sep 17 00:00:00 2001 From: Anowar Hosen <85840896+MdAnowarHosen@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:31:50 +0600 Subject: [PATCH 6/8] remove white space --- src/Illuminate/Support/Str.php | 4 ++-- tests/Support/SupportStrTest.php | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Illuminate/Support/Str.php b/src/Illuminate/Support/Str.php index 28372b3e458c..c3ee3901eb8f 100644 --- a/src/Illuminate/Support/Str.php +++ b/src/Illuminate/Support/Str.php @@ -3,6 +3,8 @@ namespace Illuminate\Support; use Closure; +use Egulias\EmailValidator\EmailValidator; +use Egulias\EmailValidator\Validation\RFCValidation; use Illuminate\Support\Traits\Macroable; use JsonException; use League\CommonMark\Environment\Environment; @@ -18,8 +20,6 @@ use Throwable; use Traversable; use voku\helper\ASCII; -use Egulias\EmailValidator\EmailValidator; -use Egulias\EmailValidator\Validation\RFCValidation; class Str { diff --git a/tests/Support/SupportStrTest.php b/tests/Support/SupportStrTest.php index 08f351ae2898..f573cb1ac4f8 100755 --- a/tests/Support/SupportStrTest.php +++ b/tests/Support/SupportStrTest.php @@ -1678,11 +1678,7 @@ public function testValidEmails() $this->assertFalse(Str::isEmail('user.@domain.com')); $this->assertFalse(Str::isEmail('user..name@domain.com')); $this->assertFalse(Str::isEmail('user@sub_domain.com')); - } - - - } class StringableObjectStub From e6b8687ecd2c35203bb6a3fe81720812744bcfa0 Mon Sep 17 00:00:00 2001 From: Anowar Hosen <85840896+MdAnowarHosen@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:37:08 +0600 Subject: [PATCH 7/8] space removed --- src/Illuminate/Support/Str.php | 1 + tests/Support/SupportStrTest.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Illuminate/Support/Str.php b/src/Illuminate/Support/Str.php index c3ee3901eb8f..1d2435affc41 100644 --- a/src/Illuminate/Support/Str.php +++ b/src/Illuminate/Support/Str.php @@ -2022,6 +2022,7 @@ public static function freezeUlids(?Closure $callback = null) public static function isEmail(string $value): bool { $validator = new EmailValidator(); + return $validator->isValid($value, new RFCValidation()); } diff --git a/tests/Support/SupportStrTest.php b/tests/Support/SupportStrTest.php index f573cb1ac4f8..3e783941c355 100755 --- a/tests/Support/SupportStrTest.php +++ b/tests/Support/SupportStrTest.php @@ -1650,7 +1650,7 @@ public function testValidEmails() $this->assertTrue(Str::isEmail('user_name@domain.com')); $this->assertTrue(Str::isEmail('user-name@domain.io')); $this->assertTrue(Str::isEmail('user@localhost')); - $this->assertTrue(Str::isEmail('user@123.123.123.123')); + $this->assertTrue(Str::isEmail('user@123.123.123.123')); $this->assertTrue(Str::isEmail('"user@name"@example.com')); $this->assertTrue(Str::isEmail('"john.doe"@example.com')); $this->assertTrue(Str::isEmail('very.common@example.com')); From 668893efbbb58b73a1ec70719f639cde5247487f Mon Sep 17 00:00:00 2001 From: Anowar Hosen <85840896+MdAnowarHosen@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:38:27 +0600 Subject: [PATCH 8/8] whitespace removed --- src/Illuminate/Support/Str.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Support/Str.php b/src/Illuminate/Support/Str.php index 1d2435affc41..bf5266069066 100644 --- a/src/Illuminate/Support/Str.php +++ b/src/Illuminate/Support/Str.php @@ -2022,7 +2022,7 @@ public static function freezeUlids(?Closure $callback = null) public static function isEmail(string $value): bool { $validator = new EmailValidator(); - + return $validator->isValid($value, new RFCValidation()); }