Bu fonksiyonu r10'dan veya ceviz.net'ten almıştım baya işe yarıyor..

function boldegel($str,$start,$length,$next=TRUE)
{
    if($length==0)
        return ''; 
    $totalLength=strlen($str);
/* Start olayı */
    if ($str{$start} !=' ' AND $start !=0) {
    while ($str{$start} !=' ') {
    $start++;
    } }
/* Bitti */
    if($totalLength>$length)
    {
        // eğer ($start+$length) toplam karakterden sayısından
        // daha büyükse $length değişkenini, $start'dan sonraki 
        // karakter sayısına eşitliyoruz
        if($totalLength<($start+$length))
            $length=$totalLength-$start;
        
        if($next==TRUE)
        {
            if($length<0)
            {    
                $length=$totalLength+$length;
                if($length<0) // yine de negatifse
                    return '';
            }
            else
                $length+=$start;
        
            // eğer boşluk karakterine denk gelirse 
            // bir sonraki boşluğu almaması için "$length-1" yapıyoruz
            $length2=strpos($str,' ',$length-1);
            
            if($length2===FALSE) // eğer hiç boşluk yoksa
                $length2=$totalLength;
            
            $length2-=$start;
        }
        else
        {
            $length2=strrpos(substr($str,$start,$length),' ');
            if($length2===FALSE) // eğer hiç boşluk yoksa
                $length2=$length;
        }
        $str=substr($str,$start,$length2);
    }
    else
        $str=substr($str,$start,$length);
    return $str;
}
kullanımı;

$bol=boldegel($kelime,0,20);