Mb strimwidth: примеры (PHP)

Использование mb_strimwidth для обрезки строк в PHP
Раздел: Многобайтовые строки
mb_strimwidth(string $string, int $start, int $width, string $trim_marker = "", ?string $encoding = null): string

Описание функции mb_strimwidth

Функция mb_strimwidth() обрезает строку до указанной ширины, учитывая многобайтовые символы. Она используется для форматирования вывода текста, особенно когда важна визуальная длина строки, а не просто количество символов. Это актуально для работы с языками, использующими нелатинские алфавиты (например, китайский, японский, арабский, русский), где символы могут занимать разную ширину при отображении.

Аргументы функции
  • $string (string) - Обязательный. Исходная строка для обработки.
  • $start (int) - Обязательный. Смещение в символах, с которого начинается обрезка. Если значение отрицательное, отсчет идет от конца строки.
  • $width (int) - Обязательный. Желаемая ширина строки после обрезки. Если ширина равна 0, функция вернет пустую строку. Символы суррогатных пар считаются за 1 символ.
  • $trim_marker (string) - Необязательный. Строка, которая добавляется в конец обрезанной строки. По умолчанию - пустая строка ('').
  • $encoding (string) - Необязательный. Параметр кодировки. Если не указан, используется внутренняя кодировка.

Примеры использования mb_strimwidth

Базовое использование
echo mb_strimwidth("Длинный текст для примера", 0, 10, '...');
Длинный т...
Использование отрицательного смещения
echo mb_strimwidth("Пример текста", -6, 6, '...');
...текста
Обрезка с середины строки
echo mb_strimwidth("Очень интересная статья", 6, 12, '~');
интересная~
Использование указания кодировки
echo mb_strimwidth("Hello world", 0, 8, '...', 'UTF-8');
Hello w...

Похожие функции в PHP

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

mb_strimwidth vs substr

substr() обрезает строку по количеству байтов, а не символов, что может привести к повреждению многобайтовых символов. mb_strimwidth() безопасна для Unicode.

mb_strimwidth vs mb_substr

mb_substr() извлекает часть строки по смещению и длине в символах. Основное отличие - mb_strimwidth() добавляет маркер обрезки и работает с визуальной шириной строки, хотя в большинстве реализаций это эквивалентно длине в символах.

Когда что использовать

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

Типичные ошибки

Неверная кодировка

Указание неверной кодировки может привести к некорректной обрезке или ошибкам.

// Если строка в UTF-8, а кодировка указана как ASCII
echo mb_strimwidth("Привет", 0, 3, '...', 'ASCII');
Может выдать некорректный результат или предупреждение.
Отрицательная ширина

Если аргумент $width отрицательный, функция вернет пустую строку.

echo mb_strimwidth("Текст", 0, -5, '...');
(пустая строка)
Стартовая позиция за пределами строки

Если $start больше длины строки, функция вернет $trim_marker (если он задан) или пустую строку.

echo mb_strimwidth("Кот", 10, 5, '[...]');
[...]

Изменения в последних версиях PHP

Начиная с PHP 7.4, параметр $trim_marker стал опциональным и по умолчанию равен пустой строке. Ранее его нужно было указывать явно.

В PHP 8.0 функция теперь выбрасывает ValueError, если параметр $width меньше 0. Ранее при отрицательной ширине возвращалась пустая строка без ошибок.

// PHP < 8.0
var_dump(mb_strimwidth('text', 0, -1));
// string(0) ""

// PHP >= 8.0
// ValueError: mb_strimwidth(): Argument #3 ($width) must be greater than or equal to 0

Расширенные примеры

Обрезка текста для анонса
Пример php
$article = "Это полный текст новости, который нужно сократить для preview.";
$preview = mb_strimwidth($article, 0, 50, ' [читать далее]');
echo $preview;
Это полный текст новости, который нужно [читать далее]
Работа с эмодзи и суррогатными парами

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

Пример php
$text = "Hello \u{1F44B}\u{1F3FC} World"; // ????????
echo mb_strimwidth($text, 0, 8, '...', 'UTF-8');
Hello ????????...
Постепенная обрезка массива строк
Пример php
$titles = [
    "Первая очень длинная запись в блоге",
    "Короткая",
    "Еще одна длинная история о программировании"
];
$trimmed = array_map(fn($title) => mb_strimwidth($title, 0, 20, '...'), $titles);
print_r($trimmed);
Array
(
    [0] => Первая очень длинная...
    [1] => Короткая
    [2] => Еще одна длинная исто...
)
Использование с разными кодировками
Пример php
$str_utf8 = "Пример строки";
$str_win1251 = mb_convert_encoding($str_utf8, 'Windows-1251', 'UTF-8');
echo mb_strimwidth($str_win1251, 0, 10, '..', 'Windows-1251');
Пример с..

Аналоги функции в других языках

Mb strimwidth в Python

Прямого аналога нет, но можно скомбинировать срезы и проверку длины. Библиотека textwrap предоставляет функции для переноса и обрезки текста.

text = "Длинный текст для примера"
if len(text) > 10:
    result = text[:7] + '...'
else:
    result = text
print(result)  # Длинный...

Mb strimwidth в Javascript

Метод slice() в сочетании с проверкой длины. Для работы с символами вне BMP можно использовать Array.from.

let str = "Длинный текст для примера";
let width = 10;
let result = Array.from(str).length > width ? Array.from(str).slice(0, 7).join('') + '...' : str;
console.log(result); // Длинный...

Mb strimwidth в MySQL

Функция SUBSTRING() или LEFT(). Стоит учитывать, что работа идет с длиной в байтах для charset, отличных от multi-byte.

SELECT INSERT(SUBSTRING('Длинный текст для примера', 1, 7), 8, 0, '...');
-- Результат: Длинный...

PHP mb_strimwidth function comments

En
Mb strimwidth Get truncated string with specified width