Работа с регистром символов в языке PHP

Раздел: Основы PHP -> Строковые функции

Основные функции для преобразования в верхний регистр

Преобразование строк в верхний регистр - одна из базовых операций при обработке текста в PHP. В зависимости от кодировки и требуемого результата используются разные функции. Далее рассмотрены основные подходы.

Наиболее эффективное решение: mb_strtoupper

Функция mb_strtoupper преобразует строку в верхний регистр с учетом многобайтовой кодировки, например UTF-8. Это необходимо для корректной работы с кириллицей, символами немецкого, французского и других языков.

<?php
$str = 'Привет, мир!';
echo mb_strtoupper($str, 'UTF-8');
?>

большие буквы php (преобразование в заглавные буквы в php)

ПРИВЕТ, МИР!

Проблемы: Если кодировка не указана, используется внутренняя кодировка (можно установить через mb_internal_encoding). Без указания UTF-8 может работать некорректно с кириллицей в некоторых конфигурациях.

Как сделать заглавной всю строку без учета кодировки?

Вариант: strtoupper

Функция strtoupper подходит только для однобайтовых кодировок (ASCII, Latin-1). Пример:

<?php
echo strtoupper('hello world');
?>
HELLO WORLD

Типичная ошибка: Применение strtoupper к UTF-8 строке приводит к потере многобайтовых символов. Например, 'привет' превращается в искаженные символы из-за того, что функция воспринимает каждый байт отдельно. Решение: Используйте mb_strtoupper.

Целесообразность: strtoupper полезна для работы с англоязычными текстами в кодировке ASCII. В современных проектах рекомендуется придерживаться mb_* функций для универсальности.

Как сделать заглавной только первую букву строки?

Вариант: ucfirst

Функция ucfirst преобразует первый символ строки в заглавный, остальные оставляет без изменений. Пример:

<?php
echo ucfirst('hello world');
?>
Hello world

Проблема: ucfirst не работает с многобайтовыми кодировками. Для UTF-8 первая буква может быть представлена несколькими байтами, и ucfirst исказит её. Решение: Используйте комбинацию mb_substr и mb_strtoupper:

<?php
$str = 'привет';
echo mb_strtoupper(mb_substr($str, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($str, 1, null, 'UTF-8');
?>
Привет

Использование: ucfirst применяется для приведения предложений к правильному регистру (начало предложения с заглавной). Для UTF-8 используйте самодельную обертку.

Как сделать заглавными первые буквы каждого слова?

Вариант: ucwords

Функция ucwords делает заглавной первую букву каждого слова в строке. Слова разделяются пробелом, табуляцией, новой строкой, возвратом каретки, символом form-feed и вертикальной табуляцией.

<?php
echo ucwords('hello world php');
?>
Hello World Php

Расширенные параметры: В PHP 5.4.32+ и 5.5.16+ можно задать список разделителей вторым аргументом:

<?php
echo ucwords('hello-world-php', '-');
?>
Hello-World-Php

Проблема с UTF-8: ucwords также не поддерживает многобайтовые кодировки. Для UTF-8 используйте mb_convert_case с MB_CASE_TITLE.

Как преобразовать строку в заголовочный регистр с поддержкой Unicode?

Вариант: mb_convert_case с MB_CASE_TITLE

Функция mb_convert_case преобразует регистр строки в зависимости от режима. Режим MB_CASE_TITLE делает заглавной первую букву каждого слова.

<?php
echo mb_convert_case('привет мир', MB_CASE_TITLE, 'UTF-8');
?>
Привет Мир

Другие режимы: MB_CASE_UPPER (полностью заглавные), MB_CASE_LOWER (полностью строчные).

Внимание: В некоторых реализациях PHP mb_convert_case может работать медленнее, чем mb_strtoupper для больших строк. Кроме того, он требует указания кодировки.

Применение: Идеально для многоязычных сайтов, где нужно привести названия статей, заголовки к единому виду.

Как написать собственную функцию для преобразования букв в верхний регистр по сложным правилам?

Вариант: кастомная функция с регулярными выражениями

Пример: сделать заглавными только буквы латиницы, а кириллицу оставить без изменений.

<?php
function custom_strtoupper($str) {
    return preg_replace_callback('![a-z]!u', function($m) {
        return mb_strtoupper($m[0], 'UTF-8');
    }, $str);
}
echo custom_strtoupper('hello привет world');
?>
HELLO привет WORLD

Сложности: Регулярные выражения с флагом 'u' требуют корректной UTF-8 строки. Если строка невалидна, preg_replace_callback может вернуть null. Рекомендуется предварительно проверять строку через mb_check_encoding.

Когда использовать: Когда стандартные функции не покрывают специфических требований (например, преобразование только определенных алфавитов или игнорирование символов в кавычках).

Пример 1: Работа с разными кодировками в mb_strtoupper

Предположим, у нас есть строка в кодировке Windows-1251, полученная из старой базы данных. Используем mb_strtoupper с указанием кодировки.

Пример
<?php
$str = iconv('UTF-8', 'Windows-1251', 'Привет'); // перекодируем для примера
$upper1251 = mb_strtoupper($str, 'Windows-1251');
echo iconv('Windows-1251', 'UTF-8', $upper1251); // обратно в UTF-8 для вывода
?>
ПРИВЕТ

Важно, что на сервере должна быть установлена поддержка кодировки Windows-1251.

Пример 2: Аналог ucwords для UTF-8 через mb_convert_case

Пример
<?php
function mb_ucwords($str, $encoding = 'UTF-8') {
    return mb_convert_case($str, MB_CASE_TITLE, $encoding);
}
echo mb_ucwords('привет мир! как дела?');
?>
Привет Мир! Как Дела?

Обратите внимание, что после восклицательного знака слово 'как' тоже начинается с заглавной - это особенность MB_CASE_TITLE, которая считает восклицательный знак разделителем.

Пример 3: Преобразование первой буквы каждого предложения в UTF-8

Реализация через разбиение по точке, восклицательному и вопросительному знакам.

Пример
<?php
function ucfirst_sentences($text, $encoding = 'UTF-8') {
    $sentences = preg_split('~([.!?]+)~u', $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    $result = '';
    foreach ($sentences as $part) {
        if (preg_match('~^[.!?]+$~u', $part)) {
            $result .= $part;
        } else {
            $first = mb_strtoupper(mb_substr($part, 0, 1, $encoding), $encoding);
            $rest = mb_substr($part, 1, null, $encoding);
            $result .= $first . $rest;
        }
    }
    return $result;
}
echo ucfirst_sentences('привет мир. как дела? всё хорошо!');
?>
Привет мир. Как дела? Всё хорошо!

Проблема: многоточие '...' будет разбито на три точки и каждая точка обработана как разделитель. Решение: добавить обработку многоточия как отдельного паттерна.

Пример 4: Преобразование ключей массива в верхний регистр

Пример
<?php
$array = ['firstName' => 'John', 'lastName' => 'Doe'];
$upperKeys = array_combine(
    array_map(function($key) { return mb_strtoupper($key, 'UTF-8'); }, array_keys($array)),
    $array
);
print_r($upperKeys);
?>
Array
(
    [FIRSTNAME] => John
    [LASTNAME] => Doe
)

Это полезно для нормализации данных из разных источников.

Пример 5: case-insensitive сравнение для UTF-8

Стандартная функция strcasecmp не работает с многобайтовыми строками. Альтернатива - сравнить обе строки в одном регистре.

Пример
<?php
function mb_casecmp($str1, $str2, $encoding = 'UTF-8') {
    return strcmp(mb_strtoupper($str1, $encoding), mb_strtoupper($str2, $encoding));
}
$s1 = 'Привет';
$s2 = 'привет';
echo mb_casecmp($s1, $s2) === 0 ? 'равны' : 'не равны';
?>
равны

Пример 6: Заголовочный регистр с исключениями для предлогов

Пример
<?php
function titleCase($str, $encoding = 'UTF-8') {
    $exceptions = ['в', 'на', 'под', 'с', 'из', 'у', 'для', 'за', 'о', 'об', 'по', 'от', 'до', 'без', 'через', 'между'];
    preg_match_all('~[^ ]+~u', $str, $words);
    $words = $words[0];
    $result = [];
    foreach ($words as $i => $word) {
        // Всегда заглавная первая буква первого и последнего слова
        if ($i == 0 || $i == count($words) - 1) {
            $result[] = mb_convert_case($word, MB_CASE_TITLE, $encoding);
        } else {
            $lower = mb_convert_case($word, MB_CASE_LOWER, $encoding);
            if (in_array($lower, $exceptions)) {
                $result[] = $lower;
            } else {
                $result[] = mb_convert_case($word, MB_CASE_TITLE, $encoding);
            }
        }
    }
    return implode(' ', $result);
}
echo titleCase('война и мир');
?>
Война и Мир

Обратите внимание: предлог 'и' остался строчным, хотя по правилам русского языка в заголовках он не делается заглавным (вариативно). Функция демонстрирует принцип кастомизации.

Преобразование в заглавные буквы в PHP - comments

En
большие буквы php (php)