<?php
function short($sString, $iLength, $sAfter = '... ')
{
    if(strpos($sString, '<') !== false && $iLength != strlen(strip_tags($sString)))
    {
        # De lengte van string.
        $iTotal = strlen($sString);
        
        # Alle open tags.
        $aOpenTags = array();
        
        # De verkorte string.
        $sNew = '';
        
        for($i = 0; $i < $iTotal; $i++)
        {
            # Haalt het huidige karakter op.
            $s = $sString{$i};
            
            # We hebben te maken met een mogelijke tag.
            if($s == '<' && ($iPos = strpos($sString, '>', $i)) !== false)
            {
                # Haal de tag op.
                $sTag = substr($sString, $i, $iPos - $i + 1);
                
                # Kijken of het een open of gesloten is.
                if($sTag{1} == '/') # Sluit tag.
                {
                    # Haalt de tag naam uit de tag.
                    if(($iEndPos = strpos($sTag, ' ')) !== false || ($iEndPos = strpos($sTag, '>')) !== false)
                    {
                        $sTagName = substr($sTag, 2, $iEndPos - 2);
                        
                        # Als de sluitende tag gelijk is aan degeen die op dat moment open is, haal hem uit de array.
                        if($sTagName == end($aOpenTags))
                        {
                            array_pop($aOpenTags);
                        }
                    }
                }
                else if($sTag{strlen($sTag) - 2} != '/') # Open Tag.
                {
                    # Haalt de tag naam uit de tag.
                    if(($iEndPos = strpos($sTag, ' ')) !== false || ($iEndPos = strpos($sTag, '>')) !== false)
                    {
                        $sTagName = substr($sTag, 1, $iEndPos - 1);
                        
                        # Voeg de open tag toe aan alle geopende tags.
                        $aOpenTags[] = $sTagName;
                    }
                }
                
                # Voeg de tag toe bij de verkorte string.
                $sNew .= $sTag;
                
                # Verzet de pointer.
                $i += strlen($sTag) - 1;
                
                continue;
            }
            else # Tekst.
            {
                # Voeg de karakter toe aan de afgekorte string.
                $sNew .= $s;
                $iLength--;
                
                # Als de max. lengte is behaald, beeindig dan de loop en plak er de teken reeks achter.
                if($iLength <= 0)
                {
                    $sNew .= $sAfter;
                    
                    # Sluit alle nog open tags.
                    while(end($aOpenTags) !== false)
                    {
                        $sNew .= '</'.end($aOpenTags).'>';
                        array_pop($aOpenTags);
                    }
                    break;
                }
            }
        }
    }
    else
    {
        $sNew = strlen($sString) > $iLength ? substr($sString, 0, $iLength).$sAfter : $sString;
    }
    
    return $sNew;
}
?>