Wordwrap: примеры (PHP)
wordwrap(string string [, int width [, string break [, bool cut]]]): stringФункция 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, такие слова останутся целыми и превысят заданную ширину, так как перенос осуществляется только по пробелам.
$text = "Очень длинная строка, которая должна быть разбита на несколько более коротких строк.";
echo wordwrap($text, 30);
Очень длинная строка, которая должна быть разбита на несколько более коротких строк.
$text = "Строка для переноса.";
echo wordwrap($text, 10, '<br>');
Строка для переноса.
$text = "СловоСверхДлинное и обычное слово.";
echo wordwrap($text, 8, "\n", true);
СловоСве рхДлинн ое и обычное слово.
- explode(): Разбивает строку по заданному разделителю на массив. Используется, когда нужно работать с отдельными частями строки как с элементами массива, а не с цельной отформатированной строкой.
- nl2br(): Вставляет HTML-тег <br> перед каждым переводом строки. Часто используется совместно с
wordwrapдля вывода отформатированного текста в браузере. - str_split(): Разбивает строку на массив фрагментов заданной длины. В отличие от
wordwrap, разбивает строго по количеству символов, не учитывая границы слов. - preg_split(): Позволяет разбивать строку по сложным правилам, заданным регулярным выражением. Подходит для нетривиальных случаев, где простого разделения по длине или символам недостаточно.
Функцию wordwrap предпочтительнее использовать для задач форматирования текста с учетом читаемости (границ слов). str_split применяется для обработки данных, где важна точная длина фрагмента, а не целостность слов.
// Ожидание, что строка будет разбита строго по 5 символов, включая пробелы.
$result = wordwrap('Hello World', 5, "\n", true);
echo $result;
Hello Worl d
Функция разбивает по словам, а пробел между "Hello" и "World" заменяется на разрыв. Слово "World" разбивается принудительно.
// Передача строки вместо целого числа до PHP 8
$result = wordwrap('Some text', '10');
echo $result;
В PHP 7 и ниже это вызовет предупреждение, но функция попытается преобразовать строку в число. В PHP 8+ будет выброшена ошибка TypeError, если используется строгий режим типов.
// В строке уже есть символы '\n'
$text = "Первая строка.\nВторая длинная строка, которая нуждается в переносе.";
echo wordwrap($text, 30);
Первая строка. Вторая длинная строка, которая нуждается в переносе.
Существующие символы разрыва строки сохраняются, и новая разбивка добавляется независимо от них.
- 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добавлялся даже в конец последней строки.
$rawText = "Уважаемый клиент! Ваш заказ №12345 готов к выдаче. Спасибо, что выбрали нас.";
$wrappedForEmail = wordwrap($rawText, 50, "<br>\n");
echo $wrappedForEmail;
Уважаемый клиент! Ваш заказ №12345 готов к выдаче.<br> Спасибо, что выбрали нас.
$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 | Короткое.
$poem = "Духовной жаждою томим, В пустыне мрачной я влачился, и шестикрылый серафим На перепутье мне явился.";
$lines = explode("\n", wordwrap($poem, 30));
foreach ($lines as $i => $line) {
echo sprintf("%02d | %s\n", $i+1, $line);
}
01 | Духовной жаждою томим, В 02 | пустыне мрачной я влачился, 03 | и шестикрылый серафим На 04 | перепутье мне явился.
// Простой 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);
Строка с ???? эмодзи и русским текстом.
import textwrap
text = "Очень длинная строка для примера."
wrapped = textwrap.fill(text, width=15)
print(wrapped)
Очень длинная строка для примера.
Отличие: textwrap.fill() по умолчанию обрезает начальные и конечные пробелы и предоставляет больше опций (например, initial_indent).
В JavaScript нет прямой аналогии. Реализация часто требует ручного кода или использования регулярных выражений.
function wordWrap(str, maxWidth) {
return str.replace(
new RegExp(`(?![^\\n]{1,${maxWidth}}$)([^\\n]{1,${maxWidth}})\\s`, 'g'),
'$1\n'
);
}
console.log(wordWrap("Длинная строка для обертки", 10));
Длинная строка для обертки
Для форматирования в запросах обычно используют логику на стороне приложения. Для простого разбиения можно комбинировать функции SUBSTRING() и LENGTH(), но это сложно и неудобно.