Работа с регистром символов в языке 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('война и мир');
?>
Война и Мир
Обратите внимание: предлог 'и' остался строчным, хотя по правилам русского языка в заголовках он не делается заглавным (вариативно). Функция демонстрирует принцип кастомизации.