diff --git a/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php b/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php index f5ad195b0325..0edc84376205 100644 --- a/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php +++ b/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php @@ -65,7 +65,7 @@ protected function transform($key, $value) return $value; } - return preg_replace('~^[\s\x{FEFF}\x{200B}]+|[\s\x{FEFF}\x{200B}]+$~u', '', $value) ?? trim($value); + return preg_replace('~^[\s\x{FEFF}\x{200B}\x{200E}]+|[\s\x{FEFF}\x{200B}\x{200E}]+$~u', '', $value) ?? trim($value); } /** diff --git a/tests/Http/Middleware/TrimStringsTest.php b/tests/Http/Middleware/TrimStringsTest.php index 98302534b6a5..4fa0f3f623c7 100644 --- a/tests/Http/Middleware/TrimStringsTest.php +++ b/tests/Http/Middleware/TrimStringsTest.php @@ -132,4 +132,94 @@ public function test_combination_of_leading_and_trailing_zero_width_non_breakabl $this->assertEquals('This title contains a combination of zero-width non-breakable space and zero-width spaces characters at the beginning and the end', $req->title); }); } + + /** + * Test leading invisible character are trimmed [U+200E]. + */ + public function test_leading_invisible_characters_are_trimmed() + { + $request = new Request; + + $request->merge([ + 'title' => '‎This title contains a invisible character at the beginning', + ]); + + $middleware = new TrimStrings; + + $middleware->handle($request, function ($req) { + $this->assertEquals('This title contains a invisible character at the beginning', $req->title); + }); + } + + /** + * Test trailing invisible character are trimmed [U+200E]. + */ + public function test_trailing_invisible_characters_are_trimmed() + { + $request = new Request; + + $request->merge([ + 'title' => 'This title contains a invisible character at the end‎', + ]); + + $middleware = new TrimStrings; + + $middleware->handle($request, function ($req) { + $this->assertEquals('This title contains a invisible character at the end', $req->title); + }); + } + + /** + * Test leading multiple invisible character are trimmed [U+200E]. + */ + public function test_leading_multiple_invisible_characters_are_trimmed() + { + $request = new Request; + + $request->merge([ + 'title' => '‎‎This title contains a invisible character at the beginning', + ]); + + $middleware = new TrimStrings; + + $middleware->handle($request, function ($req) { + $this->assertEquals('This title contains a invisible character at the beginning', $req->title); + }); + } + + /** + * Test trailing multiple invisible character are trimmed [U+200E]. + */ + public function test_trailing_multiple_invisible_characters_are_trimmed() + { + $request = new Request; + + $request->merge([ + 'title' => 'This title contains a invisible character at the end‎‎', + ]); + + $middleware = new TrimStrings; + + $middleware->handle($request, function ($req) { + $this->assertEquals('This title contains a invisible character at the end', $req->title); + }); + } + + /** + * Test combination of leading and trailing multiple invisible characters are trimmed [U+200E]. + */ + public function test_combination_of_leading_and_trailing_multiple_invisible_characters_are_trimmed() + { + $request = new Request; + + $request->merge([ + 'title' => '‎‎This title contains a combination of a invisible character at beginning and the end‎‎', + ]); + + $middleware = new TrimStrings; + + $middleware->handle($request, function ($req) { + $this->assertEquals('This title contains a combination of a invisible character at beginning and the end', $req->title); + }); + } }