Вопрос очень простой.
Но простой он не потому, что реализация простая, а потому, что это наверное один из самых популярных запросов в поисковике на эту тему (возможно :-D)
Вы можете погуглить и получить много решений этой задачи и воспользоваться им, а так же воспользоваться ответом выше, т.к. функции
mb_ - это отличный вариант.
Но вы можете не верить никому ))) ... и подсмотреть как это делает какой-нибудь Laravel
https://github.com/laravel/framework/blob/8.x/src/...
Избавившись от привязки к классу, можно взять эту функцию себе на вооружение примерно так:
function limit($value, $limit = 100, $end = '...')
{
if (mb_strwidth($value, 'UTF-8') <= $limit) {
return $value;
}
return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')) . $end;
}
И это тоже ответ на ваш вопрос.
А что использовать, решать вам.