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

Работа с функцией mb_strcut: примеры и особенности
Раздел: Многобайтовые строки
mb_strcut(string $string, int $start, ?int $length = null, ?string $encoding = null): string

Функция mb_strcut в PHP предназначена для безопасного извлечения части строки с учётом многобайтовых кодировок. Она используется при работе с текстами в кодировках UTF-8, UTF-16 и других, где один символ может занимать несколько байтов. Это позволяет избежать проблем с разрывом символов при обрезке строк.

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

Функция принимает до четырёх параметров:

  • string — исходная строка для обработки.
  • start — позиция начала извлечения. Если значение отрицательное, отсчёт идёт с конца строки.
  • length (опционально) — максимальная длина извлекаемой части. Если не указана или равна NULL, извлечение происходит до конца строки. Если длина отрицательна, то эта количество символов будет отброшено с конца строки.
  • encoding (опционально) — кодировка строки. Если не указана, используется внутренняя кодировка скрипта.
Простые варианты использования

Извлечение части строки с указанием начала и длины:

<?php
$str = "Пример строки на русском";
echo mb_strcut($str, 0, 7); // Пример
?>
Пример

Использование отрицательного старта:

<?php
$str = "Пример строки на русском";
echo mb_strcut($str, -14, 6); // строки
?>
строки

Отрицательная длина отсекает символы с конца:

<?php
$str = "Пример строки на русском";
echo mb_strcut($str, 0, -10); // Пример строки
?>
Пример строки

Явное указание кодировки:

<?php
$str = "Пример строки";
echo mb_strcut($str, 0, 5, 'UTF-8'); // Приме
?>
Приме
Похожие функции в PHP

mb_substr() — аналогично извлекает подстроку, но более чувствительна к границам символов. Рекомендуется использовать для работы с логическими границами символов.

substr() — базовая функция для однобайтовых кодировок. Не подходит для многобайтовых строк, так как может разрывать символы.

iconv_substr() — извлекает часть строки с учётом кодировки, используя библиотеку iconv. Может быть полезна в специфических кодировках.

Выбор функции зависит от задачи: mb_strcut оптимальна для безопасной обрезки по байтам с учётом кодировки, а mb_substr — для работы с символьными границами.

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

Использование неправильной кодировки приводит к некорректному результату:

<?php
$str = "Пример";
echo mb_strcut($str, 0, 3, 'ASCII'); // может вывести искажённый символ
?>

Путаница между позицией в байтах и символах при использовании substr вместо mb_strcut:

<?php
$str = "Пример";
echo substr($str, 0, 3); // выводит часть байта, искажая символ
?>

Ожидание, что отрицательная длина работает как в substr (от конца строки), но в mb_strcut она отсекает символы с конца извлекаемой подстроки:

<?php
$str = "Пример строки";
echo mb_strcut($str, 0, -5); // Пример стр
?>
Пример стр
Изменения в PHP 8

В PHP 8 функция mb_strcut получила поддержку отрицательной длины. Ранее отрицательное значение интерпретировалось как NULL, и извлечение шло до конца строки. Теперь отрицательная длина отсекает указанное количество символов с конца.

Также улучшена обработка ошибок передачи неверных кодировок: в некоторых случаях теперь вызывается TypeError.

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

Обрезка строки для превью с добавлением многоточия, если длина превышена:

Пример php
<?php
function cutPreview($text, $maxLen = 100) {
    if (mb_strlen($text) > $maxLen) {
        return mb_strcut($text, 0, $maxLen) . '...';
    }
    return $text;
}
$article = "Это длинный текст статьи, который нужно сократить для анонса.";
echo cutPreview($article, 30);
?>
Это длинный текст статьи, к...

Извлечение подстроки из строки с эмодзи и многобайтовыми символами:

Пример php
<?php
$str = "Привет ???? мир";
echo mb_strcut($str, 0, 9); // Привет ????
?>
Привет ????

Использование в цикле для обработки массива строк:

Пример php
<?php
$strings = ["Первая строка", "Вторая текст", "Третья информация"];
$result = array_map(fn($s) => mb_strcut($s, 0, 8), $strings);
print_r($result);
?>
Array
(
    [0] => Первая с
    [1] => Вторая т
    [2] => Третья и
)

Безопасное извлечение из строки с неизвестной кодировкой через определение кодировки:

Пример php
<?php
$str = "Пример";
$encoding = mb_detect_encoding($str);
echo mb_strcut($str, 0, 4, $encoding); // Прим
?>
Прим
Аналоги в других языках

Python: Используется срез строк с учётом Unicode. Python 3 строки по умолчанию Unicode, поэтому обрезка безопасна.

text = "Пример строки"
result = text[0:7]
print(result)  # Пример
Пример

JavaScript: Метод substring() или slice() работают с кодовыми единицами UTF-16, что может вызывать проблемы с суррогатными парами. Для полной поддержки Unicode используют итерацию по символам.

let text = "Пример строки";
let result = text.substring(0, 7);
console.log(result); // Пример
Пример

MySQL: Функция SUBSTRING() с указанием кодировки для многобайтовых строк.

SELECT SUBSTRING('Пример строки' FROM 1 FOR 7); -- Пример
Пример

PHP mb_strcut function comments

En
Mb strcut Get part of string