Aşağıdaki örnekler CodeIgniter 3'den.. Yıllar geçse de eskimez.
mb_substr mb_strlen vs.. türkçe karakterli cümlelerde sorun yaşamanızı engellemiş olur.

<?php
function word_limiter($str, $limit = 100, $end_char = '…') {
    if (trim($str) === '') {
        return $str;
    }

    preg_match('/^\s*+(?:\S++\s*+){1,' . (int) $limit . '}/', $str, $matches);

    if (strlen($str) === strlen($matches[0])) {
        $end_char = '';
    }

    return rtrim($matches[0]) . $end_char;
}

function character_limiter($str, $n = 500, $end_char = '…') {
    if (mb_strlen($str) < $n) {
        return $str;
    }

    $str = preg_replace('/ {2,}/', ' ', str_replace(array("\r", "\n", "\t", "\v", "\f"), ' ', $str));

    if (mb_strlen($str) <= $n) {
        return $str;
    }

    $out = '';
    foreach (explode(' ', trim($str)) as $val) {
        $out .= $val . ' ';

        if (mb_strlen($out) >= $n) {
            $out = trim($out);
            return (mb_strlen($out) === mb_strlen($str)) ? $out : $out . $end_char;
        }
    }
}

$content = 'Bu, veritabanından çekilen uzun bir metin örneğidir ve 50 karakterden fazla uzunluğa sahiptir.';

echo word_limiter($content, 10);
echo '<br><br>';
echo character_limiter($content, 20);