Как сделать первый символ заглавным в PHP: полное руководство
Методы преобразования первой буквы в заглавную
Основное универсальное решение:
Для преобразования первой буквы строки в заглавный регистр, независимо от кодировки (включая UTF-8), используется комбинация функций mb_strtoupper и mb_substr. Это гарантирует корректную работу с кириллицей, иероглифами и другими многобайтовыми символами.
$str = "привет мир";
$result = mb_strtoupper(mb_substr($str, 0, 1)) . mb_substr($str, 1);
echo $result; // "Привет мир"
Пояснение: функция mb_substr извлекает первый символ (длина 1), mb_strtoupper переводит его в верхний регистр, затем к результату приклеивается оставшаяся часть строки (начиная со второго символа).
Типичные проблемы:
- Использование ucfirst с кириллицей в UTF-8 приводит к потере данных или выводу кракозябров, так как эта функция работает только с однобайтовыми кодировками (Latin-1).
- Забыв указать кодировку в mb_substr и mb_strtoupper - по умолчанию используется внутренняя кодировка, которая может не совпадать с кодировкой строки. Рекомендуется явно передавать 'UTF-8' третьим параметром.
- Пустая строка: если строка пуста, mb_substr вернёт пустую строку, и результат будет корректным.
Как сделать заглавной первую букву, если строка содержит только латиницу?
Для строк в однобайтовой кодировке (например, ASCII) можно использовать встроенную функцию ucfirst.
$str = "hello world";
echo ucfirst($str); // "Hello world"
Функция работает быстро, но не подходит для кириллицы, умляутов и других многобайтовых символов. Если строка гарантированно содержит только латиницу, это самый простой способ.
Ошибка: применение ucfirst к строке в UTF-8 с кириллицей. Вместо заглавной буквы появляется мусор. Решение: использовать mb_ функции.
Как сделать заглавной первую букву каждого слова в строке?
Функция ucwords преобразует первый символ каждого слова в заглавный. Если нужно изменить только первое слово, её использовать не стоит, но для полноты картины приведём пример.
$str = "hello world from php";
echo ucwords($str); // "Hello World From Php"
Для мультибайтовых строк применяется mb_convert_case с флагом MB_CASE_TITLE.
$str = "привет мир из php";
echo mb_convert_case($str, MB_CASE_TITLE, 'UTF-8'); // "Привет Мир Из Php"
Важно: MB_CASE_TITLE делает заглавной первую букву каждого слова, а не только первого. Если нужно только первое слово, следует использовать комбинацию mb_*.
Проблема: MB_CASE_TITLE по умолчанию использует внутреннюю кодировку, что может привести к ошибкам при работе с UTF-8. Всегда указывайте третий параметр явно.
Как сделать заглавной первую букву с помощью регулярного выражения?
Можно использовать preg_replace_callback для замены первого символа. Этот способ избыточен, но полезен, если нужна дополнительная логика (например, игнорировать пробелы в начале).
$str = " example ";
$result = preg_replace_callback('/^(\s*)(\w)/u', function($m) {
return $m[1] . mb_strtoupper($m[2], 'UTF-8');
}, $str);
echo $result; // " Example "
Пояснение: шаблон ищет ведущие пробелы (если есть) и первый буквенный символ. Замыкание возвращает пробелы и заглавную версию первого символа. Модификатор u включает поддержку UTF-8.
Ошибка: без модификатора u регулярное выражение не распознает кириллицу. Также стоит помнить, что \w соответствует только буквам, цифрам и подчёркиванию; для строго буквенного символа лучше использовать \p{L}.
Как сделать заглавной первую букву с помощью strtr?
Менее распространённый способ - использование strtr с таблицей перевода для первого символа. Но такой подход требует заранее задать все возможные заглавные эквиваленты и неудобен для мультибайтовых строк.
// только для латиницы
$str = "hello";
$first = substr($str, 0, 1);
$upper = strtr($first, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
$result = $upper . substr($str, 1);
echo $result; // "Hello"
Этот метод крайне негибкий и не рекомендуется для реальных проектов.
Дополнительные примеры и сценарии использования
Рассмотрим несколько расширенных ситуаций, которые помогут глубже понять особенности преобразования первой буквы.
Пример 1. Сравнение ucfirst и мультибайтового подхода для кириллицы
$str = "привет мир";
echo "ucfirst: " . ucfirst($str) . "\n";
echo "mb: " . mb_strtoupper(mb_substr($str, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($str, 1, null, 'UTF-8');
ucfirst: ?привет мир (или кракозябры) mb: Привет мир
Как видно, ucfirst не справляется с кириллицей в UTF-8, выводя искажённый символ. Мультибайтовый метод работает корректно.
Пример 2. Пустая строка
$str = "";
$result = mb_strtoupper(mb_substr($str, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($str, 1, null, 'UTF-8');
var_dump($result);
string(0) ""
Пустая строка остаётся пустой, ошибки не возникает.
Пример 3. Строка, начинающаяся с пробела
$str = " hello";
$result = mb_strtoupper(mb_substr(ltrim($str), 0, 1, 'UTF-8'), 'UTF-8') . mb_substr(ltrim($str), 1, null, 'UTF-8');
echo $result; // "Hello" (пробелы отброшены)
// Если нужно сохранить пробелы:
$result2 = mb_strtoupper(mb_substr($str, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($str, 1, null, 'UTF-8');
echo $result2; // " Hello" (пробел стал заглавным? Нет, пробел не буква, остаётся пробелом)
Hello Hello
Обратите внимание: если не удалять пробелы, первый символ (пробел) не изменится, а буква останется строчной. Для коррекции нужно предварительно удалить пробелы или использовать регулярное выражение.
Пример 4. Строка, начинающаяся с цифры
$str = "123abc";
$result = mb_strtoupper(mb_substr($str, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($str, 1, null, 'UTF-8');
echo $result; // "123abc" (цифра 1 не изменится)
123abc
Функция не изменяет небуквенные символы, что логично.
Пример 5. Юникодные символы (например, с диакритикой)
$str = "élève";
$result = mb_strtoupper(mb_substr($str, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($str, 1, null, 'UTF-8');
echo $result; // "Élève" (é → É)
Élève
Мультибайтовые функции корректно обрабатывают символы с диакритическими знаками.
Пример 6. Использование mb_convert_case для первого слова (не всего слова, а первого)
Можно комбинировать mb_convert_case с MB_CASE_TITLE, но это сделает заглавной первую букву каждого слова. Чтобы ограничиться только первым словом, используется разбиение по словам.
$str = "hello world";
$words = explode(' ', $str);
$words[0] = mb_convert_case($words[0], MB_CASE_TITLE, 'UTF-8');
$result = implode(' ', $words);
echo $result; // "Hello world"
Hello world
Пример 7. Использование lcfirst для обратного преобразования
Функция lcfirst делает первую букву строчной. Применяется, когда нужно инвертировать регистр.
$str = "Hello";
echo lcfirst($str); // "hello"
hello
Для мультибайтовых строк аналог: mb_strtolower(mb_substr(...)) . mb_substr(...).
Пример 8. Регулярное выражение с \p{L} для точного совпадения буквы
$str = "123привет";
$result = preg_replace_callback('/^(\s*)(\p{L})/u', function($m) {
return $m[1] . mb_strtoupper($m[2], 'UTF-8');
}, $str);
echo $result; // "123Привет" (пропустил цифры, изменил первую букву "п")
123Привет
Использование \p{L} гарантирует, что будет найден именно буквенный символ Unicode, а не цифра или подчёркивание.