<?php
function truncate($text, $length = 100, $ending = '...', $exact = true, $considerHtml = false) {
if (is_array ( $ending )) {
extract ( $ending );
}
if ($considerHtml) {
if (strlen ( preg_replace ( '/<.*?>/', '', $text ) ) <= $length) {
return $text;
}
$totalLength = mb_strlen ( $ending );
$openTags = array ();
$truncate = '';
preg_match_all ( '/(<\/?([\w+]+)[^>]*>)?([^<>]*)/', $text, $tags, PREG_SET_ORDER );
foreach ( $tags as $tag ) {
if (! preg_match ( '/img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param/s', $tag [2] )) {
if (preg_match ( '/<[\w]+[^>]*>/s', $tag [0] )) {
array_unshift ( $openTags, $tag [2] );
} else if (preg_match ( '/<\/([\w]+)[^>]*>/s', $tag [0], $closeTag )) {
$pos = array_search ( $closeTag [1], $openTags );
if ($pos !== false) {
array_splice ( $openTags, $pos, 1 );
}
}
}
$truncate .= $tag [1];
$contentLength = strlen ( preg_replace ( '/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', ' ', $tag [3] ) );
if ($contentLength + $totalLength > $length) {
$left = $length - $totalLength;
$entitiesLength = 0;
if (preg_match_all ( '/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', $tag [3], $entities, PREG_OFFSET_CAPTURE )) {
foreach ( $entities [0] as $entity ) {
if ($entity [1] + 1 - $entitiesLength <= $left) {
$left --;
$entitiesLength += strlen ( $entity [0] );
} else {
break;
}
}
}
$truncate .= substr ( $tag [3], 0, $left + $entitiesLength );
break;
} else {
$truncate .= $tag [3];
$totalLength += $contentLength;
}
if ($totalLength >= $length) {
break;
}
}
} else {
if (strlen ( $text ) <= $length) {
return $text;
} else {
$truncate = substr ( $text, 0, $length - strlen ( $ending ) );
}
}
if (! $exact) {
$spacepos = strrpos ( $truncate, ' ' );
if (isset ( $spacepos )) {
if ($considerHtml) {
$bits = substr ( $truncate, $spacepos );
preg_match_all ( '/<\/([a-z]+)>/', $bits, $droppedTags, PREG_SET_ORDER );
if (! empty ( $droppedTags )) {
foreach ( $droppedTags as $closingTag ) {
if (! in_array ( $closingTag [1], $openTags )) {
array_unshift ( $openTags, $closingTag [1] );
}
}
}
}
$truncate = substr ( $truncate, 0, $spacepos );
}
}
$truncate .= $ending;
if ($considerHtml) {
foreach ( $openTags as $tag ) {
$truncate .= '';
}
}
return $truncate;
}
var_dump(truncate("0123456789ABC"));
- Output for 4.3.0 - 4.3.11, 4.4.0 - 4.4.9, 5.0.0 - 5.0.5, 5.1.0 - 5.1.6, 5.2.0 - 5.2.17, 5.3.0 - 5.3.29, 5.4.0 - 5.4.45, 5.5.24 - 5.5.35, 5.6.7 - 5.6.28, 7.0.0 - 7.0.20, 7.1.0 - 7.1.20, 7.2.0 - 7.2.33, 7.3.12 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.6
- string(13) "0123456789ABC"
preferences:
207.84 ms | 405 KiB | 314 Q