Skip to content
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
50 changes: 50 additions & 0 deletions src/Symfony/Component/String/Tests/UnicodeStringTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,56 @@

class UnicodeStringTest extends AbstractUnicodeTestCase
{
/**
* @dataProvider provideTrimNormalization
*/
public function testTrimPrefixNormalization(string $expected, string $string, $prefix)
{
$str = new UnicodeString($string);
$this->assertSame($expected, $str->trimPrefix($prefix)->toString());
}

/**
* @dataProvider provideTrimNormalization
*/
public function testTrimSuffixNormalization(string $expected, string $string, $suffix)
{
$suffixStr = match (true) {
$suffix instanceof AbstractString => $suffix->toString(),
\is_array($suffix) => implode('', $suffix),
$suffix instanceof \Traversable => implode('', iterator_to_array($suffix)),
default => (string) $suffix,
};

$str = new UnicodeString($expected.$suffixStr);
$this->assertSame($expected, $str->trimSuffix($suffix)->toString());
}

public static function provideTrimNormalization(): iterable
{
// "é" in NFC (\xC3\xA9) vs NFD (\x65\xCC\x81)
$nfc = "\xC3\xA9";
$nfd = "\x65\xCC\x81";

yield 'nfc_string_nfd_prefix' => ['abc', $nfc.'abc', $nfd];
yield 'nfd_string_nfc_prefix' => ['abc', $nfd.'abc', $nfc];

yield 'abstract_string' => ['abc', $nfc.'abc', new UnicodeString($nfd)];

yield 'array' => ['abc', $nfc.'abc', [$nfd]];

yield 'stringable' => ['abc', $nfc.'abc', new class($nfd) implements \Stringable {
public function __construct(private string $s)
{
}

public function __toString(): string
{
return $this->s;
}
}];
}

protected static function createFromString(string $string): AbstractString
{
return new UnicodeString($string);
Expand Down
38 changes: 38 additions & 0 deletions src/Symfony/Component/String/UnicodeString.php
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,44 @@ public function startsWith(string|iterable|AbstractString $prefix): bool
return $prefix === grapheme_extract($this->string, \strlen($prefix), \GRAPHEME_EXTR_MAXBYTES);
}

public function trimPrefix($prefix): static
{
if (\is_array($prefix) || $prefix instanceof \Traversable) {
return parent::trimPrefix($prefix);
}

if ($prefix instanceof AbstractString) {
$prefix = $prefix->string;
} else {
$prefix = (string) $prefix;
}

if (!normalizer_is_normalized($prefix, \Normalizer::NFC)) {
$prefix = normalizer_normalize($prefix, \Normalizer::NFC);
}

return parent::trimPrefix($prefix);
}

public function trimSuffix($suffix): static
{
if (\is_array($suffix) || $suffix instanceof \Traversable) {
return parent::trimSuffix($suffix);
}

if ($suffix instanceof AbstractString) {
$suffix = $suffix->string;
} else {
$suffix = (string) $suffix;
}

if (!normalizer_is_normalized($suffix, \Normalizer::NFC)) {
$suffix = normalizer_normalize($suffix, \Normalizer::NFC);
}

return parent::trimSuffix($suffix);
}

/**
* @return void
*/
Expand Down