Mb strcut: примеры (PHP)
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'); // Приме
?>Приме
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 функция mb_strcut получила поддержку отрицательной длины. Ранее отрицательное значение интерпретировалось как NULL, и извлечение шло до конца строки. Теперь отрицательная длина отсекает указанное количество символов с конца.
Также улучшена обработка ошибок передачи неверных кодировок: в некоторых случаях теперь вызывается TypeError.
Обрезка строки для превью с добавлением многоточия, если длина превышена:
<?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
$str = "Привет ???? мир";
echo mb_strcut($str, 0, 9); // Привет ????
?>Привет ????
Использование в цикле для обработки массива строк:
<?php
$strings = ["Первая строка", "Вторая текст", "Третья информация"];
$result = array_map(fn($s) => mb_strcut($s, 0, 8), $strings);
print_r($result);
?>Array
(
[0] => Первая с
[1] => Вторая т
[2] => Третья и
)Безопасное извлечение из строки с неизвестной кодировкой через определение кодировки:
<?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); -- ПримерПример