Skip to content

Instantly share code, notes, and snippets.

@yvolkan
Last active January 15, 2018 13:11
Show Gist options
  • Save yvolkan/70b9c10100e8cf21917edcda3b17fe90 to your computer and use it in GitHub Desktop.
Save yvolkan/70b9c10100e8cf21917edcda3b17fe90 to your computer and use it in GitHub Desktop.
PHP Html Truncate
function html_truncate($text, $length, $suffix = '…', $isHTML = true)
{
$i = 0;
$simpleTags = ['br' => true, 'hr' => true, 'input' => true, 'image' => true, 'link' => true, 'meta' => true];
$tags = [];
if ($isHTML) {
preg_match_all('/<[^>]+>([^<]*)/', $text, $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
foreach ($m as $o) {
if ($o[0][1] - $i >= $length) {
break;
}
$t = substr(strtok($o[0][0], " \t\n\r\0\x0B>"), 1);
// test if the tag is unpaired, then we mustn't save them
if ($t[0] != '/' && !isset($simpleTags[$t])) {
$tags[] = $t;
} elseif (end($tags) == substr($t, 1)) {
array_pop($tags);
}
$i += $o[1][1] - $o[0][1];
}
}
// output without closing tags
$output = substr($text, 0, $length = min(strlen($text), $length + $i));
// closing tags
$output2 = count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : '';
// Find last space or HTML tag (solving problem with last space in HTML tag eg. <span class="new">)
$preg = preg_split('/<.*>| /', $output, -1, PREG_SPLIT_OFFSET_CAPTURE);
$last = end($preg);
$pos = (int) end($last);
// Append closing tags to output
$output .= $output2;
// Get everything until last space
$one = substr($output, 0, $pos);
// Get the rest
$two = substr($output, $pos, (strlen($output) - $pos));
// Extract all tags from the last bit
preg_match_all('/<(.*?)>/s', $two, $tags);
// Add suffix if needed
if (strlen($text) > $length) {
$one .= $suffix;
}
// Re-attach tags
$output = $one . implode($tags[0]);
// added to remove unnecessary closure
$output = str_replace('</!-->', '', $output);
return $output;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment