Hi,

I'm always wondering if there is a truncate function for a Text (a
post f.e.) which considers opened HTML tags. Everytime i'd truncated a
text with the normal truncate function available in TextHelper, some
html tags werent closed and so my whole page looks damaged.
So i programmed a function which closes HTML functions.
I like you to review this function and to tell me your ideas.
Up to now, the function only acepts std xhtml:


function truncate($text, $length, $ending = '...', $exact = false) {
                if(strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
                        return $text;
                }

                preg_match_all('/(<.+?>)?([^<>]*)/is', $text, $ausgabe,
PREG_SET_ORDER);

                $total_length = 0;
                $arr_elements = array();
                $truncate = '';

                foreach($ausgabe as $treffer) {
                        if(!empty($treffer[1])) {
                                //<img />
                if(preg_match('/^<\s*.+?\/\s*>$/s', $treffer[1])) {
                                        //echo 
'1:'.htmlspecialchars($treffer[1]).'<br>';
                                //</b>
                } else if(preg_match('/^<\s*\/([^\s]+?)\s*>$/s',
$treffer[1], $treffer2)) {
                    //echo '2:'.htmlspecialchars($treffer2[1]).'<br>';
                    $pos = array_search($treffer2[1], $arr_elements);
                    if($pos !== false) {
                        unset($arr_elements[$pos]);
                    }
                //<b>
                } else if(preg_match('/^<\s*([^\s>!]+).*?>$/s',
$treffer[1], $treffer2)) {
                        array_unshift($arr_elements,
strtolower($treffer2[1]));
                        //echo '3:'.htmlspecialchars($treffer2[1]).'<br>';
                }
                $truncate .= $treffer[1];
                        }
                        $content_length = 
strlen(preg_replace('/(&[a-z]{1,6};|&#[0-9]+;)/
i', ' ', $treffer[2]));
                        if($total_length >= $length) {
                                break;
                        } else if($total_length+$content_length > $length) {
                                $left = 
$total_length>$length?$total_length-$length:$length-
$total_length;
                                $entities_length = 0;
                                if(preg_match_all('/&[a-z]{1,6};|&#[0-9]+;/i', 
$treffer[2],
$treffer3, PREG_OFFSET_CAPTURE)) {
                    foreach($treffer3[0] as $entity) {
                        if($entity[1]+1-$entities_length <= $left) {
                                $left--;
                                $entities_length += strlen($entity[0]);
                        } else break;
                    }
                }
                                $truncate .= substr($treffer[2], 0, 
$left+$entities_length);
                                break;
                        } else {
                                $truncate .= $treffer[2];
                                $total_length += $content_length;
                        }
                }
                //var_dump($ausgabe);
                if(!$exact) {
                        $spacepos = strrpos($truncate, ' ');
                        if(isset($spacepos)) {
                                $truncate = substr($truncate, 0, $spacepos);
                        }
                }
                $truncate .= $ending;
                foreach($arr_elements as $element) {
                        $truncate .= '</' . $element . '>';
                }
                return $truncate;
        }


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Cake 
PHP" group.
To post to this group, send email to cake-php@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to