3v4l.org

run code in 300+ PHP versions simultaneously
<?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