Современные подходы к форматированию строк
Основные методы форматирования строк в PHP
Форматирование строк - неотъемлемая часть разработки. В PHP есть несколько подходов, каждый для своих задач. В этой статье разобраны основные функции и их применение.
Наиболее эффективное решение: sprintf и printf
Функции sprintf и printf используют шаблон со спецификаторами формата. sprintf возвращает строку, printf выводит сразу. Поддерживаются типы: %d (целые), %f (с плавающей точкой), %s (строки), а также флаги выравнивания, ширины и точности.
$name = 'Иван';
$age = 30;
$greeting = sprintf('Привет, %s! Тебе %d лет.', $name, $age);
echo $greeting;
Привет, Иван! Тебе 30 лет.
Пояснение:
Спецификатор %s подставляет строку, %d - целое. Ширина: %10s дополнит пробелами слева. Точность: %.2f - два знака после запятой.
Типичные ошибки:
- Несовпадение порядка спецификаторов и аргументов - приводит к неверному выводу.
- Использование %f для целых чисел - может вызвать предупреждение.
- Забывание экранирования процента: нужно %% для вывода одного %.
Как объединить строки конкатенацией?
Конкатенация через точку (.) - базовый способ. Подходит для простых случаев, но при многих переменных код становится громоздким.
$firstName = 'Иван';
$lastName = 'Петров';
$fullName = $firstName . ' ' . $lastName;
echo $fullName;
Иван Петров
- Пропущенные разделители (пробелы) между частями.
- Сложность чтения длинных цепочек.
- Необходимость приведения типов при конкатенации чисел.
Как дополнить строку до нужной длины?
Функция str_pad дополняет строку заданным символом до указанной длины. Полезна для выравнивания в таблицах.
$text = 'PHP';
echo str_pad($text, 10, '_', STR_PAD_BOTH);
__PHP_____
Четвёртый параметр - направление: STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH. По умолчанию дополнение справа.
- Если длина строки больше заданной, функция возвращает исходную строку без изменений.
- Символ заполнения может быть многобайтовым - требуется учитывать кодировку.
Как отформатировать число с разделителями тысяч?
number_format группирует тысячи, задаёт количество десятичных знаков и разделители.
$number = 1234567.89;
echo number_format($number, 2, ',', ' ');
1 234 567,89
Первый параметр - число, второй - десятичные знаки, третий - десятичный разделитель, четвёртый - разделитель тысяч.
- Если не указать разделители явно, используется локаль сервера.
- Знак валюты не добавляется автоматически - его нужно добавлять отдельно.
Как использовать интерполяцию переменных в двойных кавычках?
PHP позволяет вставлять переменные прямо в строки в двойных кавычках и heredoc. Для сложных выражений применяются фигурные скобки.
$name = 'Анна';
echo "Привет, {$name}!";
Привет, Анна!
- В одинарных кавычках интерполяция не работает.
- Если после переменной идёт буква или цифра, нужно использовать фигурные скобки.
- Для массивов требуется явное указание ключа: "{$arr['key']}".
Как заменить подстроку по шаблону?
str_replace и str_ireplace заменяют вхождения одной подстроки на другую.
$text = 'Hello, [name]!';
echo str_replace('[name]', 'John', $text);
Hello, John!
- str_replace учитывает регистр, str_ireplace - нет.
- Для сложных замен лучше подходит preg_replace.
Как отформатировать дату и время?
Функция date и метод DateTime::format позволяют вывести метку времени в нужном формате.
echo date('d.m.Y H:i:s');
23.03.2025 14:30:00
- Неверные символы формата дают пустой результат или ошибку.
- Часовой пояс по умолчанию - серверный; его меняют через date_default_timezone_set.
Как применить heredoc для многострочных строк?
Heredoc позволяет создавать многострочные строки с интерполяцией. Nowdoc работает как одинарные кавычки (без интерполяции).
$name = 'Мир';
$heredoc = <<
Привет, Мир! Это многострочная строка.
- Закрывающий идентификатор должен быть в самом начале строки, без пробелов.
- В heredoc можно использовать любые символы, кроме закрывающего идентификатора.
Как использовать vsprintf для массива аргументов?
vsprintf работает как sprintf, но принимает массив аргументов. Удобно при динамическом количестве параметров.
$format = 'Имя: %s, возраст: %d';
$data = ['Петр', 25];
echo vsprintf($format, $data);
Имя: Петр, возраст: 25
- Массив должен содержать ровно столько элементов, сколько спецификаторов.
Как разобрать строку по формату (sscanf)?
sscanf разбирает строку в соответствии с шаблоном - обратная операция к sprintf.
$str = 'Температура: 25.5 C';
$result = sscanf($str, 'Температура: %f C');
print_r($result);
Array ( [0] => 25.5 )
- Строка должна строго соответствовать шаблону, иначе некоторые поля не будут извлечены.
Как преобразовать специальные символы в HTML-сущности?
htmlspecialchars преобразует &, <, >, " и ' в HTML-сущности. Используется для безопасного вывода.
$text = '';
echo htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
<script>alert("xss")</script>
- Неверная кодировка может исказить символы.
- Для обратного преобразования применяется html_entity_decode.
Расширенные примеры форматирования
Комбинирование различных функций и использование редко встречающихся спецификаторов.
// Флаги sprintf: выравнивание и заполнение
$num = 42;
echo sprintf("'%04d'", $num);
echo sprintf("'%-4d'", $num);
echo sprintf("'%+d'", $num);
echo sprintf("'% d'", $num);
'0042' '42 ' '+42' ' 42'
Пояснение:
Флаг 0 - заполнение нулями слева, минус - выравнивание влево, плюс - всегда знак, пробел - пробел перед положительными.
// Форматирование валюты с числом
$price = 12345.6789;
$formatted = number_format($price, 2, '.', ',');
echo "Цена: \${$formatted}";
Цена: $12,345.68
Пояснение:
number_format округляет, добавляет разделители. Символ валюты добавлен вручную.
// Многострочный heredoc с массивом
$items = ['Apple', 'Banana', 'Cherry'];
$output = <<
{$items[0]}
{$items[1]}
{$items[2]}
LIST;
echo $output;
- Apple
- Banana
- Cherry
Пояснение:
Heredoc с фигурными скобками позволяет вставлять элементы массива.
// vsprintf с динамическим массивом
$format = "Число: %d, строка: %s, float: %.2f";
$args = [10, 'тест', 3.14159];
echo vsprintf($format, $args);
Число: 10, строка: тест, float: 3.14
Пояснение:
Удобно, когда аргументы получены из внешнего источника.
// sscanf для разбора лога
$log = '2025-03-23 14:30:00 ERROR: не удалось подключиться';
$result = sscanf($log, '%4d-%2d-%2d %2d:%2d:%2d %s: %[^$]');
list($y, $m, $d, $h, $i, $s, $level, $message) = $result;
echo "Год: $y, месяц: $m, уровень: $level, сообщение: $message";
Год: 2025, месяц: 03, уровень: ERROR, сообщение: не удалось подключиться
Пояснение:
Спецификатор %[^$] захватывает все символы до конца строки.
// nl2br для перевода строк в HTML
$text = "Первая строка\nВторая строка";
echo nl2br($text);
Первая строка
Вторая строка
Пояснение:
nl2br заменяет \n на
, полезно для отображения многострочного текста.
// str_pad с циклом для выравнивания
$lines = ['Короткая строка', 'Длинная строка текста', 'Средняя'];
foreach ($lines as $line) {
$padded = str_pad($line, 30, '.');
echo $padded . PHP_EOL;
}
Короткая строка................... Длинная строка текста.......... Средняя..........................
Пояснение:
Создание столбцов фиксированной ширины для табличного вывода.
// Динамическая ширина через звёздочку
$width = 10;
$text = 'PHP';
printf("%*s", $width, $text);
PHP
Пояснение:
Звёздочка * указывает, что ширина берётся из следующего аргумента. Удобно для переменной ширины.