PHP: Truncate a Multibyte String to ~n Words Using mb_* Functions

Solution:1


/**
 * PrintBrief : Returns a truncated version of the string (word-safe, multibyte-safe).
 * 
 * @param string $str        The input string.
 * @param int    $max_chars  Maximum characters before truncation.
 * @param string $encoding   Multibyte encoding (default: UTF-8).
 * 
 * @return string            Truncated string with ellipsis if shortened.
 */
function PrintBrief($str, $max_chars = ALLOWED_NUM_OF_CHARS, $encoding = "UTF-8") 
{
    mb_regex_encoding($encoding);
    mb_internal_encoding($encoding);

    if (mb_strlen($str, $encoding) > $max_chars) {
        // Cut string at character limit
        $str = mb_substr($str, 0, $max_chars, $encoding);

        // Split into words
        $words = mb_split(' ', $str);

        // Remove last incomplete word
        array_pop($words);

        // Rebuild sentence
        $truncated = trim(implode(' ', $words));

        // Clean trailing punctuation
        $punctuation = [';', ','];
        foreach ($punctuation as $p) {
            $truncated = rtrim($truncated, $p);
        }

        return $truncated . ' ...';
    }

    return $str;
}

Example Usage


<?php
$str = "şğıöç İĞŞ ĞŞĞŞ Öİ ÇÇ Orta Amerika'nın en büyük ülkesi Nikaragua'nın başkenti Managua 
dün sabaha karşı büyük bir patlamayla sarsıldı. Olayın, şehre düşen ufak bir meteroit sonucu 
açılan krater çukurundan kaynaklandığı anlaşıldı. 1 milyon 200 bin kişinin yaşadığı ve bünyesinde 
ulsulararası bir havalimanının da olduğu şehre meteorit düşmesi sonucu, sürpriz bir şekilde can 
veya mal kaybı yaşanmadı ancak 12 metre çapında bir krater çukuru açıldı ve patlama neredeyse 
şehrin tamamında hissedildi.";

// Example: limit string to ~300 characters
echo PrintBrief($str, 300);
?>