1

Wordwrap: примеры (PHP)

Использование wordwrap для форматирования текста в PHP
Раздел: Работа со строками
wordwrap(string string [, int width [, string break [, bool cut]]]): string
PHP функция wordwrap: предназначение и синтаксис

Функция wordwrap в PHP применяется для разбиения строки текста на несколько строк заданной длины. Основное ее использование связано с форматированием длинного текста для корректного отображения, например, в текстовых файлах, письмах электронной почты или при подготовке данных для систем, не обрабатывающих автоматический перенос слов.

Аргументы функции

Функция имеет следующую сигнатуру:

wordwrap(
    string $string,
    int $width = 75,
    string $break = "\n",
    bool $cut_long_words = false
): string
  • $string (обязательный): Исходная строка для обработки.
  • $width (по умолчанию 75): Максимальная ширина строки в символах. Если слово длиннее этого значения, его обработка зависит от флага $cut_long_words.
  • $break (по умолчанию "\n"): Строка, используемая в качестве символа разрыва между строками.
  • $cut_long_words (по умолчанию false): Если установлено в true, слова, длина которых превышает $width, будут принудительно разбиты по этому значению. Если false, такие слова останутся целыми и превысят заданную ширину, так как перенос осуществляется только по пробелам.
Простые варианты применения wordwrap
Базовое использование с переносом по пробелам
$text = "Очень длинная строка, которая должна быть разбита на несколько более коротких строк.";
echo wordwrap($text, 30);
Очень длинная строка, которая
должна быть разбита на несколько
более коротких строк.
Использование другого символа разрыва
$text = "Строка для переноса.";
echo wordwrap($text, 10, '<br>');
Строка для
переноса.
Принудительный разрыв длинных слов ($cut_long_words = true)
$text = "СловоСверхДлинное и обычное слово.";
echo wordwrap($text, 8, "\n", true);
СловоСве
рхДлинн
ое и
обычное
слово.
Похожие функции в PHP
  • explode(): Разбивает строку по заданному разделителю на массив. Используется, когда нужно работать с отдельными частями строки как с элементами массива, а не с цельной отформатированной строкой.
  • nl2br(): Вставляет HTML-тег <br> перед каждым переводом строки. Часто используется совместно с wordwrap для вывода отформатированного текста в браузере.
  • str_split(): Разбивает строку на массив фрагментов заданной длины. В отличие от wordwrap, разбивает строго по количеству символов, не учитывая границы слов.
  • preg_split(): Позволяет разбивать строку по сложным правилам, заданным регулярным выражением. Подходит для нетривиальных случаев, где простого разделения по длине или символам недостаточно.

Функцию wordwrap предпочтительнее использовать для задач форматирования текста с учетом читаемости (границ слов). str_split применяется для обработки данных, где важна точная длина фрагмента, а не целостность слов.

Распространенные ошибки при работе с wordwrap
Непонимание поведения флага $cut_long_words
// Ожидание, что строка будет разбита строго по 5 символов, включая пробелы.
$result = wordwrap('Hello World', 5, "\n", true);
echo $result;
Hello
Worl
d

Функция разбивает по словам, а пробел между "Hello" и "World" заменяется на разрыв. Слово "World" разбивается принудительно.

Передача некорректного типа данных в $width
// Передача строки вместо целого числа до PHP 8
$result = wordwrap('Some text', '10');
echo $result;

В PHP 7 и ниже это вызовет предупреждение, но функция попытается преобразовать строку в число. В PHP 8+ будет выброшена ошибка TypeError, если используется строгий режим типов.

Игнорирование символов разрыва в исходной строке
// В строке уже есть символы '\n'
$text = "Первая строка.\nВторая длинная строка, которая нуждается в переносе.";
echo wordwrap($text, 30);
Первая строка.
Вторая длинная строка,
которая нуждается в
переносе.

Существующие символы разрыва строки сохраняются, и новая разбивка добавляется независимо от них.

История изменений функции wordwrap
  • PHP 8.0.0: Параметр $width и $cut_long_words теперь ожидают строгие типы (int и bool соответственно). Передача неверного типа вызывает TypeError.
  • PHP 7.3.0: Функция стала учитывать набор символов (кодировку) при работе с многобайтовыми строками в контексте стандартной библиотеки, хотя для полноценной работы с Unicode (например, UTF-8) рекомендуется предварительно использовать mb_string функции.
  • В более ранних версиях (до PHP 4.0.2) существовала ошибка, из-за которой при $cut_long_words = true символ разрыва $break добавлялся даже в конец последней строки.
Расширенные примеры использования
Форматирование текста для HTML-писем
Пример php
$rawText = "Уважаемый клиент! Ваш заказ №12345 готов к выдаче. Спасибо, что выбрали нас.";
$wrappedForEmail = wordwrap($rawText, 50, "<br>\n");
echo $wrappedForEmail;
Уважаемый клиент! Ваш заказ №12345 готов к выдаче.<br>
Спасибо, что выбрали нас.
Подготовка данных для фиксированной ширины в консоли
Пример php
$data = [
    ['id' => 1, 'desc' => 'Очень длинное описание товара, которое не помещается в колонку.'],
    ['id' => 2, 'desc' => 'Короткое.']
];
foreach ($data as $row) {
    $wrappedDesc = wordwrap($row['desc'], 30, "\n                   ");
    printf("%2d | %s\n", $row['id'], $wrappedDesc);
}
 1 | Очень длинное описание товара,
                   которое не помещается в
                   колонку.
 2 | Короткое.
Создание "свитка" текста с многострочным префиксом
Пример php
$poem = "Духовной жаждою томим, В пустыне мрачной я влачился, и шестикрылый серафим На перепутье мне явился.";
$lines = explode("\n", wordwrap($poem, 30));
foreach ($lines as $i => $line) {
    echo sprintf("%02d | %s\n", $i+1, $line);
}
01 | Духовной жаждою томим, В
02 | пустыне мрачной я влачился,
03 | и шестикрылый серафим На
04 | перепутье мне явился.
Обработка текста с учетом многобайтовых символов (UTF-8)
Пример php
// Простой wordwrap не всегда корректно считает символы кириллицы или эмодзи.
$text = "Строка с ???? эмодзи и русским текстом.";
// Решение: использовать mb_strlen и собственную логику разбивки или
// преобразовать в массив символов.
function mb_wordwrap($str, $width, $break, $cut=false) {
    // Упрощенная реализация для демонстрации
    if (!$cut) {
        $wrapped = wordwrap($str, $width, $break);
        return $wrapped;
    }
    // Для принудительной разбивки по символам:
    $lines = [];
    while (mb_strlen($str) > $width) {
        $lines[] = mb_substr($str, 0, $width);
        $str = mb_substr($str, $width);
    }
    $lines[] = $str;
    return implode($break, $lines);
}
echo mb_wordwrap($text, 10, "\n", false);
Строка с ????
эмодзи и
русским
текстом.
Аналоги в других языках программирования
Python: модуль textwrap
import textwrap
text = "Очень длинная строка для примера."
wrapped = textwrap.fill(text, width=15)
print(wrapped)
Очень длинная
строка для
примера.

Отличие: textwrap.fill() по умолчанию обрезает начальные и конечные пробелы и предоставляет больше опций (например, initial_indent).

JavaScript: нет встроенной функции

В JavaScript нет прямой аналогии. Реализация часто требует ручного кода или использования регулярных выражений.

function wordWrap(str, maxWidth) {
    return str.replace(
        new RegExp(`(?![^\\n]{1,${maxWidth}}$)([^\\n]{1,${maxWidth}})\\s`, 'g'),
        '$1\n'
    );
}
console.log(wordWrap("Длинная строка для обертки", 10));
Длинная
строка для
обертки
MySQL: нет прямой функции

Для форматирования в запросах обычно используют логику на стороне приложения. Для простого разбиения можно комбинировать функции SUBSTRING() и LENGTH(), но это сложно и неудобно.

PHP wordwrap function comments

En
Wordwrap Wraps a string to a given number of characters