[SPIP Zone] Couper un texte proprement (le retour)

Bonjour à tous,

J’avais vaguement suivi ce fil en août en me disant que j’avais mis de côté fut un temps un bout de code à utiliser un-jour-peut-être.

Et je l’ai retrouvé ! si ça peut aider les participants de ce fil…

Je n’ai pas retrouvé sa source par contre, ni son auteur du coup.

C’est à mettre dans mes_fonctions.php pour utiliser une balise |couperpropre

<?php /* * Coupe une chaine en gardant le formatage HTML * @param string $text Texte a couper * @param integer $length Longueur a garder * @param string $ending Caracteres a ajouter a la fin * @param boolean $exact Coupure exacte * @return string */ function couperpropre($text, $length, $ending = '...', $exact = false) { 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 $truncate;

}

?>

Nath

Bonjour à tous,

J’avais vaguement suivi ce fil en août en me disant que j’avais mis de côté fut un temps un bout de code à utiliser un-jour-peut-être.

Et je l’ai retrouvé ! si ça peut aider les participants de ce fil…

Je n’ai pas retrouvé sa source par contre, ni son auteur du coup.

C’est à mettre dans mes_fonctions.php pour utiliser une balise |couperpropre

<?php /* * Coupe une chaine en gardant le formatage HTML * @param string $text Texte a couper * @param integer $length Longueur a garder * @param string $ending Caracteres a ajouter a la fin * @param boolean $exact Coupure exacte * @return string */ function couperpropre($text, $length, $ending = '...', $exact = false) { 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 $truncate;

}

?>

Nath

Et bien me voilà ravie J

De : jean-gabriel.remond@laposte.net [mailto:jean-gabriel.remond@laposte.net]
Envoyé : mercredi 15 octobre 2014 16:30
À : Nathalie Brunelli (Mirobolus)
Cc : Zone SPIP
Objet : Re: [SPIP Zone] Couper un texte proprement (le retour)

Je me connecte juste à l’instant sur ma boite pour voir cette bonne nouvelle.

Merci beaucoup Nathalie pour cette fonction.

Elle va me servir et je penses à d’autres aussi.

Amicalement Jean.


De: « Nathalie Brunelli (Mirobolus) » <nathalie.brunelli@mirobolus.fr>
À: « Zone SPIP » <spip-zone@rezo.net>
Cc: « jean-gabriel remond » <jean-gabriel.remond@laposte.net>, jcvilleneuve@cegetel.net, « bruno caillard » <bruno.caillard@free.fr>
Envoyé: Mercredi 15 Octobre 2014 16:13:03
Objet: Re: [SPIP Zone] Couper un texte proprement (le retour)

Bonjour à tous,

J’avais vaguement suivi ce fil en août en me disant que j’avais mis de côté fut un temps un bout de code à utiliser un-jour-peut-être.

Et je l’ai retrouvé ! si ça peut aider les participants de ce fil…

Je n’ai pas retrouvé sa source par contre, ni son auteur du coup.

C’est à mettre dans mes_fonctions.php pour utiliser une balise |couperpropre

<?php /* * Coupe une chaine en gardant le formatage HTML * @param string $text Texte a couper * @param integer $length Longueur a garder * @param string $ending Caracteres a ajouter a la fin * @param boolean $exact Coupure exacte * @return string */ function couperpropre($text, $length, $ending = '...', $exact = false) { 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 $truncate;

}

?>

Nath

Et avec des dents :

<?php
/*
* Coupe une chaine en gardant le formatage HTML
* @param string $text Texte a couper
* @param integer $length Longueur a garder
* @param string $ending Caracteres a ajouter a la fin
* @param boolean $exact Coupure exacte
* @return string
*/
function couperpropre($text, $length, $ending = '...', $exact = false)
{
     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 $truncate;
}
?>