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 существует несколько функций для работы со строками, которые могут выполнять схожие задачи.
substr() обрезает строку по количеству байтов, а не символов, что может привести к повреждению многобайтовых символов. mb_strimwidth() безопасна для Unicode.
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Расширенные примеры
$article = "Это полный текст новости, который нужно сократить для preview.";
$preview = mb_strimwidth($article, 0, 50, ' [читать далее]');
echo $preview;Это полный текст новости, который нужно [читать далее]
Функция корректно обрабатывает символы, состоящие из нескольких кодпоинтов (например, эмодзи с модификаторами кожи).
$text = "Hello \u{1F44B}\u{1F3FC} World"; // ????????
echo mb_strimwidth($text, 0, 8, '...', 'UTF-8');Hello ????????...
$titles = [
"Первая очень длинная запись в блоге",
"Короткая",
"Еще одна длинная история о программировании"
];
$trimmed = array_map(fn($title) => mb_strimwidth($title, 0, 20, '...'), $titles);
print_r($trimmed);Array
(
[0] => Первая очень длинная...
[1] => Короткая
[2] => Еще одна длинная исто...
)$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, '...');
-- Результат: Длинный...