Forum Moderators: coopster

Message Too Old, No Replies

Easy, I just want to move ellipses

move ellipses outside [...]

         

paperso

5:34 pm on Sep 12, 2010 (gmt 0)

10+ Year Member



Hello WebmasterWorld!

This is my second post.

Please bear with me.


I have this code and I want to move the ellipses outside the outputed HTML ending tags.

I parse it like this:
truncate('<p>Hello <strong>World!<.strong></p>', 10, TRUE, ' [...]');



function truncate
function truncate($text, $length = 100, $HTML, $ellipse) {

$ellipsis = $ellipse;
$exact = TRUE; // 2010/09/05
$htmltags = $HTML;

if ($htmltags) {

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

preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER);
$total_length = strlen($ellipsis);
$open_tags = array();
$truncate = '';

foreach ($lines as $line_matchings) {

if (!empty($line_matchings[1])) {
if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) {
} else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
$pos = array_search($tag_matchings[1], $open_tags);
if ($pos !== false) { unset($open_tags[$pos]); }
} else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) {
array_unshift($open_tags, strtolower($tag_matchings[1]));
}
$truncate .= $line_matchings[1];
}

$content_length = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', ' ', $line_matchings[2]));

if ($total_length+$content_length> $length) {
$left = $length - $total_length;
$entities_length = 0;

if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) {
foreach ($entities[0] as $entity) {
if ($entity[1]+1-$entities_length <= $left) {
$left--;
$entities_length += strlen($entity[0]);
} else {
break;
}
}
}
$truncate .= substr($line_matchings[2], 0, $left+$entities_length);
break;

} else {
$truncate .= $line_matchings[2];
$total_length += $content_length;
}

if($total_length>= $length) { break; }
}
} else {
if (strlen($text) <= $length) {
return strip_tags($text); // added strip_tags 08/17/2010
} else {
$truncate = substr($text, 0, $length - strlen($ellipsis));
}
}

if (!$exact) {
$spacepos = strrpos($truncate, ' ');
if (isset($spacepos)) {
$truncate = substr($truncate, 0, $spacepos);
}
}

// If $allow_HTML is FALSE, it will strip the HTML tags 08/17/2010
if ($htmltags == TRUE) {} else { $truncate = strip_tags($truncate); }

$truncate .= $ellipsis;
if($htmltags) {

foreach ($open_tags as $tag) {
$truncate .= '</' . $tag . '>';
}
}

return $truncate;
}

penders

11:57 am on Sep 13, 2010 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member Top Contributors Of The Month



At a quick glance, it looks as if you just need to swap round the bit of code at the end...

From this:
$truncate .= $ellipsis; 
if($htmltags) {
foreach ($open_tags as $tag) {
$truncate .= '</' . $tag . '>';
}
}


To this:

if($htmltags) { 
foreach ($open_tags as $tag) {
$truncate .= '</' . $tag . '>';
}
}
$truncate .= $ellipsis;


However, if the ellipsis is now outside the closing HTML tags then the resultant HTML could be invalid - depending on the structure of the rest of the document.

paperso

8:44 pm on Sep 13, 2010 (gmt 0)

10+ Year Member



Hello @ penders.

\(^_^)/ yes it worked! The ellipses is now outside the outputted HTML tags.

Before:
<strong>Hello World! [...]</strong>

Now it's now like this:
<strong>Hello World!</strong> [...]

Thank you @ penders.