Функция ucfirst() — стандартный способ
В PHP задача привести первый символ строки к верхнему регистру решается встроенной функцией ucfirst(). Функция принимает строку и возвращает её копию, в которой первый символ переведён в верхний регистр, а остальные символы остаются без изменений.
|
1 2 3 4 5 |
<?php echo ucfirst('hello world'); // Hello world echo ucfirst('php разработка'); // Php разработка echo ucfirst('HELLO'); // HELLO (остальные не меняются) ?> |
Синтаксис прост и понятен. Однако у ucfirst() есть существенное ограничение, с которым сталкиваются все, кто работает с русскоязычным контентом.
Проблема: ucfirst не работает с кириллицей
Функция ucfirst() — однобайтовая. Она корректно работает только с однобайтовыми кодировками (ASCII, Latin-1) и не понимает многобайтовые символы UTF-8. Кириллические символы в UTF-8 занимают 2 байта, поэтому ucfirst() «видит» только первый байт и некорректно обрабатывает строку.
|
1 2 3 4 5 |
<?php // Результат непредсказуем или пустой $str = 'привет мир'; echo ucfirst($str); // Некорректный вывод — кириллица ломается ?> |
Это распространённая проблема, с которой сталкиваются разработчики при работе с русскими строками в PHP. Стандартное решение — использовать многобайтовые строковые функции из расширения mbstring.
Решение для UTF-8 и кириллицы через mb_strtoupper и mb_substr
Для корректной работы с кириллицей и любыми UTF-8 строками нужно комбинировать функции mb_strtoupper() и mb_substr(). Принцип простой: берём первый символ, переводим его в верхний регистр, затем объединяем с остальной частью строки.
|
1 2 3 4 5 6 7 8 9 10 11 |
<?php function mb_ucfirst(string $str, string $encoding = 'UTF-8'): string { $firstChar = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding); $rest = mb_substr($str, 1, null, $encoding); return $firstChar . $rest; } echo mb_ucfirst('привет мир'); // Привет мир echo mb_ucfirst('hello world'); // Hello world echo mb_ucfirst('это тест'); // Это тест ?> |
Разберём работу функции:
- mb_substr($str, 0, 1, $encoding) — извлекает первый символ строки с учётом кодировки
- mb_strtoupper(…, $encoding) — переводит символ в верхний регистр с учётом кодировки
- mb_substr($str, 1, null, $encoding) — извлекает все символы начиная со второго
- Конкатенация объединяет заглавный первый символ с остатком строки
Функция lcfirst() — сделать первый символ строчным
Обратная задача — сделать первый символ строки строчным — решается функцией lcfirst(). Она также однобайтовая и не работает с кириллицей напрямую.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php // Для латиницы echo lcfirst('Hello World'); // hello World // Для кириллицы — аналогичная кастомная функция function mb_lcfirst(string $str, string $encoding = 'UTF-8'): string { $firstChar = mb_strtolower(mb_substr($str, 0, 1, $encoding), $encoding); $rest = mb_substr($str, 1, null, $encoding); return $firstChar . $rest; } echo mb_lcfirst('Привет Мир'); // привет Мир ?> |
Функция ucwords() — каждое слово с заглавной буквы
Функция ucwords() переводит первый символ каждого слова в верхний регистр. Слова разделяются пробелом, табуляцией, переводом строки и другими пробельными символами. Как и ucfirst, она не работает с кириллицей без дополнительной обработки.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php // Для латиницы работает echo ucwords('hello world php'); // Hello World Php // Для кириллицы — через mb_ функции function mb_ucwords(string $str, string $encoding = 'UTF-8'): string { $words = explode(' ', $str); $result = array_map(function($word) use ($encoding) { $firstChar = mb_strtoupper(mb_substr($word, 0, 1, $encoding), $encoding); $rest = mb_substr($word, 1, null, $encoding); return $firstChar . $rest; }, $words); return implode(' ', $result); } echo mb_ucwords('привет мир это тест'); // Привет Мир Это Тест ?> |
Кастомная функция для UTF-8 с поддержкой разных кодировок
На практике удобнее иметь одну универсальную функцию, которая корректно обрабатывает строки в любой кодировке и не требует каждый раз указывать параметры явно:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php /** * Аналог ucfirst() с поддержкой многобайтовых кодировок * Работает с кириллицей, иероглифами и любым UTF-8 контентом */ function mb_ucfirst(string $string, string $encoding = 'UTF-8'): string { if (empty($string)) { return $string; } return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding) . mb_substr($string, 1, mb_strlen($string, $encoding), $encoding); } // Примеры использования $tests = [ 'привет мир', 'hello world', 'это важный текст', '', 'а', ]; foreach ($tests as $test) { echo mb_ucfirst($test) . PHP_EOL; } // Привет мир // Hello world // Это важный текст // (пустая строка) // А ?> |
Использование в шаблонах Bitrix и MODX
В шаблонах CMS функция mb_ucfirst часто нужна для форматирования заголовков, имён пользователей и названий категорий. Для Bitrix24 и 1С-Битрикс:
|
1 2 3 4 5 6 7 8 9 10 11 |
<?php // В компоненте Битрикс — форматирование имени пользователя $name = $arResult['NAME']; $formattedName = mb_ucfirst(mb_strtolower($name, 'UTF-8'), 'UTF-8'); // В шаблоне result_modifier.php $arResult['DISPLAY_NAME'] = mb_ucfirst( mb_strtolower($arResult['LAST_NAME'], 'UTF-8'), 'UTF-8' ); ?> |
Для MODX Revolution в сниппетах:
|
1 2 3 4 5 |
<?php // Сниппет для форматирования заголовка $title = $modx->resource->get('pagetitle'); return mb_ucfirst(mb_strtolower($title, 'UTF-8'), 'UTF-8'); ?> |
Итог: для работы с кириллицей функция ucfirst первый символ верхний регистр php в стандартном виде не подходит. Используйте комбинацию mb_strtoupper + mb_substr или напишите вспомогательную функцию mb_ucfirst, которую можно переиспользовать во всём проекте. Убедитесь, что расширение mbstring включено в вашем PHP (в большинстве хостингов оно активно по умолчанию).
