symfony/string
Symfony String provides an object-oriented API for working with text safely and consistently. Handle bytes, UTF-8 code points, and grapheme clusters with unified string utilities for slicing, normalization, comparison, and more.
Installation:
composer require symfony/string
Laravel users: Already included in laravel/framework (via Str helper).
First Use Case: Convert a string to kebab-case for URL slugs:
use Symfony\Component\String\UnicodeString;
$string = new UnicodeString('Hello World');
$slug = $string->lower()->kebab(); // 'hello-world'
Where to Look First:
UnicodeString class (core functionality).Str::of() in Laravel (convenience facade).Immutable String Manipulation:
$name = UnicodeString::fromString(' John Doe ');
$clean = $name->trim()->title(); // 'John Doe' (immutable)
Unicode-Aware Operations:
$text = UnicodeString::fromString('CafΓ© π');
$length = $text->length(); // 6 (emoji counts as 1 grapheme cluster)
Inflection Helpers:
$plural = UnicodeString::fromString('child')->plural(); // 'children'
$pascal = UnicodeString::fromString('user_profile')->pascal(); // 'UserProfile'
Truncation with Control:
$longText = UnicodeString::fromString('A very long string...');
$truncated = $longText->truncate(10, TruncateMode::CHARACTER); // 'A very...'
Laravel Integration:
use Illuminate\Support\Str;
$slug = Str::of('User Profile')->kebab(); // 'user-profile'
startsWith(), endsWith(), or contains() for Unicode-safe checks:
if (Str::of($input)->startsWith('https://')) { ... }
$normalized = UnicodeString::fromString(' foo ')->trim()->lower();
$emoji = UnicodeString::fromString('πΊπΈπ¨π½βπ©π»βπ§π½');
$length = $emoji->length(); // 1 (single grapheme cluster)
$strings = collect(['Foo', 'Bar']);
$slugs = $strings->map(fn($s) => UnicodeString::fromString($s)->kebab());
Zero-Byte Edge Cases:
startsWith()/endsWith() may fail on strings ending with \0 (fixed in v8.0.4+).contains() or explicit substring checks.Emoji Width Calculations:
width() method for accurate character-width calculations.Serialization Deprecation:
__sleep()/__wakeup() in custom string subclasses.__serialize()/__unserialize() instead.Inflector Quirks:
EnglishInflector for custom rules:
$inflector = new EnglishInflector();
$inflector->addIrregularPlural('nexus', 'nexuses');
Performance:
$cachedSlug = fn() => Str::of($name)->kebab();
UnicodeString::fromString($str)->toString() to verify encoding.UnicodeString::fromString($str)->graphemes() to inspect clusters.Str::of() over raw UnicodeString for consistency in Laravel apps.class CustomInflector extends EnglishInflector {
public function singular($word) { ... }
}
AbstractString for domain-specific logic (e.g., EmailString).TruncateMode for custom truncation behaviors.Str facade wraps UnicodeString but adds Laravel-specific methods (e.g., random()).How can I help you explore Laravel packages today?