Современные подходы к форматированию строк

Раздел: Разработка на PHP -> Работа со строками

Основные методы форматирования строк в 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

    Пояснение:

    Звёздочка * указывает, что ширина берётся из следующего аргумента. Удобно для переменной ширины.

    Форматирование строк в PHP - comments

    En
    Php format (php)