Carnet Wiki

filtre couper en gardant mise en page

Version 2 — Mars 2015 JLuc

- Origine incertaine : http://forum.spip.net/fr_242912.html
-  Nom original : trunqhtml

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

Télécharger