Skip to content

Feature Strings

github-actions[bot] edited this page Jul 16, 2026 · 1 revision

🔤 Строки (Str)

← Возможности · Главная · Сравнение

CloudCastle\Support\Str — статические строковые утилиты, корректные для UTF-8: форматы имён, регистр, поиск и срезы, маскирование, инфлексия и предикаты. Функциональный суперсет illuminate/support, symfony/string, nette/utils, voku/stringy и doctrine/inflector.

Принцип работы

Все операции работают по символам (через mb_*), а не по байтам, поэтому кириллица, эмодзи и любые многобайтовые символы обрабатываются корректно. Горячие пути преобразования регистра имеют ASCII fast-path: для однобайтового первого символа применяется нативный strtoupper/strtolower — в разы быстрее mb_*, без потери корректности для остального.

use CloudCastle\Support\Str;

// Форматы имён
Str::studly('foo_bar_baz');   // 'FooBarBaz'
Str::camel('foo_bar_baz');    // 'fooBarBaz'
Str::snake('fooBarBaz');      // 'foo_bar_baz'
Str::kebab('fooBarBaz');      // 'foo-bar-baz'
Str::headline('user_profile');// 'User Profile'

// Регистр (UTF-8)
Str::upper('привет');         // 'ПРИВЕТ'
Str::ucfirst('привет');       // 'Привет'

// Поиск и срезы (по символам)
Str::after('a→b→c', '');     // 'b→c'
Str::between('«ключ»', '«', '»'); // 'ключ'
Str::limit('привет мир', 5);  // 'приве...'

// Маскирование ПД и генерация
Str::mask('4111111111111111', '*', 0, 12); // '************1111'
Str::random(32);              // 32 безопасных символа [A-Za-z0-9]

// Инфлексия и предикаты
Str::plural('category');      // 'categories'
Str::isUuid('e2b0dd0e-9f8a-4c1e-8b2a-1234567890ab'); // true
Str::isJson('{"a":1}');       // true

Плюсы

  • Полная многобайтовая корректность на всех операциях (срезы, длины, регистр).
  • ASCII fast-path делает преобразование имён быстрым без потери UTF-8-корректности.
  • mask заточен под финтех: скрывает карты, счета, телефоны, оставляя видимый хвост.
  • random использует random_bytes (криптостойкий источник), результат — только безопасные алфавитно-цифровые символы (без /, +, =).
  • Стабильная память: нет неограниченного статического кэша, как в illuminate/support.

Минусы

  • Статические методы (не цепочечный объект) — для fluent-стиля Unicode используйте symfony/string или voku/stringy.
  • Инфлексия ограничена возможностями doctrine/inflector (английский язык).

✅ Рекомендуется

  • Маскировать чувствительные данные перед логированием: Str::mask($pan, '*', 0, 12).
  • Нормализовать ключи конфигурации: Str::snake($rawKey).
  • Проверять формат до обработки: Str::isUuid($id) / Str::isJson($payload).

❌ Антипаттерны

  • Резать строки байтовыми substr/strlen для UTF-8 — используйте Str::substr/Str::length.
  • Генерировать токены через rand()/uniqid() — используйте Str::random (криптостойкий).
  • Логировать полные ПД — всегда применяйте Str::mask.

Схема выбора формата имени

flowchart TD
    IN["исходная строка"] --> Q{"нужный формат?"}
    Q -->|PascalCase| ST["studly()"]
    Q -->|camelCase| CA["camel()"]
    Q -->|snake_case| SN["snake()"]
    Q -->|kebab-case| KE["kebab()"]
    Q -->|Заголовок| HE["headline()"]
    ST --> OUT["результат UTF-8"]
    CA --> OUT
    SN --> OUT
    KE --> OUT
    HE --> OUT
Loading

Сравнение с аналогами

Возможность Support illuminate symfony nette voku doctrine 🏆 Победитель
Форматы имён (studly/camel/snake/kebab) ⚠️ ⚠️ Support, illuminate
Регистр UTF-8 + ASCII fast-path ⚠️ Support
mask сокрытие ПД Support, illuminate
Инфлексия plural/singular Паритет
Предикаты isJson/isUuid/isAscii ⚠️ ⚠️ ⚠️ Support, illuminate

Clone this wiki locally