<?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 git.master, git.master_jit, rfc.property-hooks
- string(13) "0123456789ABC"
This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.
Active branches
Archived branches
Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page
preferences:
65.94 ms | 401 KiB | 8 Q