1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| <?/**
* Coupe une chaine en gardant le formatage HTML
* @param string $text Texte à couper
* @param integer $length Longueur à garder
* @param string $ending Caractères à ajouter à la fin
* @param boolean $exact Coupure exacte
* @return string
*/
function trunchtml($text, $length, $ending = '...', $exact = false) {
if(strlen($text)< $length)
{
$truncate = $text;
}
else
{
if(strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
return $text;
}
preg_match_all('/(<.+?>)?([^<>]*)/is', $text, $matches, PREG_SET_ORDER);
$total_length = 0;
$arr_elements = array();
$truncate = '';
foreach($matches as $element) {
if(!empty($element[1]))
{
if(preg_match('/^<\s*.+?\/\s*>$/s', $element[1]))
{
}
else if(preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $element[1], $element2))
{
$pos = array_search($element2[1], $arr_elements);
if($pos !== false)
{
unset($arr_elements[$pos]);
}
}
else if(preg_match('/^<\s*([^\s>!]+).*?>$/s', $element[1], $element2))
{
array_unshift($arr_elements,
strtolower($element2[1]));
}
$truncate .= $element[1];
}
$content_length = strlen(preg_replace('/(&[a-z]{1,6};|&#[0-9]+;)/i', ' ', $element[2]));
if($total_length >= $length)
{
break;
}
elseif ($total_length+$content_length > $length)
{
$left = $total_length>$length?$total_length-$length:$length-$total_length;
$entities_length = 0;
if(preg_match_all('/&[a-z]{1,6};|&#[0-9]+;/i', $element[2], $element3, PREG_OFFSET_CAPTURE))
{
foreach($element3[0] as $entity)
{
if($entity[1]+1-$entities_length <= $left)
{
$left--;
$entities_length += strlen($entity[0]);
} else break;
}
}
$truncate .= substr($element[2], 0, $left+$entities_length);
break;
}
else
{
$truncate .= $element[2];
$total_length += $content_length;
}
}
if(!$exact)
{
$spacepos = strrpos($truncate, ' ');
if(isset($spacepos))
{
$truncate = substr($truncate, 0, $spacepos);
}
}
$truncate .= $ending;
foreach($arr_elements as $element)
{
$truncate .= '</' . $element . '>';
}
}
return strlen($truncate);
}
?> |
Partager