Skip to content

[11.x] Trim invisible characters #50832

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 3 commits into from
Mar 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Illuminate/Foundation/Http/Middleware/TrimStrings.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/**
Expand Down
90 changes: 90 additions & 0 deletions tests/Http/Middleware/TrimStringsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
}
}