Avant de disposer du filtre "couper", j'ai écrit un filtre qui devrait répondre à tes questions.
Il suffit de mettre le code dans ton fichier "mes_fonctions.php".
Je le copie ci-dessous car je ne crois pas que les pj passent...
A+
François
<?php
///====================================================================================
/// => tronquerTexte
//====================================================================================
/// Tronquer un texte
///
/// Retourne un tableau
/// table[0] = texte tronqué (en fin de mot et hors balise html)
/// table[1] = ce qui a été supprimé
///
//====================================================================================
/// function tronquerTexte(&$texte, $maxTexte=0) {
function tronquerTexte(&$texte, $maxTexte=0) {
if($maxTexte && strlen($texte)>$maxTexte) {
/// => Rechercher $maxtexte caractères hors balises
$i = 0; // Pour balayer le texte
$j = 0; // Pour compter les caractères affichés
while ($i<strlen($texte) && $j<$maxTexte) {
$car = substr($texte, $i, 1); // Sauter les balises
if ($car=='<') {
$i++;
while ($i<strlen($texte)) {
$car = substr($texte, $i, 1);
if ($car=='>') break;
$i++;
}
} elseif ($car=='&') { // Sauter les car. spéciaux
$i++;
while ($i<strlen($texte)) {
$car = substr($texte, $i, 1);
if ($car==';') break;
$i++;
}
}
$i++;
$j++;
}
if ($j>=$maxTexte) {
/// => Tronquer
$texte1 = substr($texte, 0, $i-1);
/// => Rechercher le dernier séparateur...
$i = 0;
foreach(array(' ', ',', '. ', '; ', ' ', "\n") as $sep) {
if($j=strrpos($texte1, $sep)) $i = max($i,$j);
}
/// ... et tronquer le texte
if($i) $texte1 = substr($texte1, 0, $i);
/// => Ne pas couper à l'intérieur d'une balise HTML (cf. mise en page Spip)
$i = strrpos($texte1,'<');
$j = strrpos($texte1,'>');
if($i>0 && (!$j || $j<$i)) $texte1 = substr($texte1, 0, $i);
$i = strlen($texte1);
/// => Rechercher le dernier retour à la ligne dans la dernière ligne (50 car.)
$i0 = max(0, $i - 50);
$i = $i0;
foreach(array('<br>', '<br />', '<p>', '<p ', '<BR>', '<BR />', '<P>', '<P ') as $sep) {
if($j=strrpos($texte1, $sep)) $i = max($j,$i);
}
/// ... et tronquer le texte again
if($i != $i0) $texte1 = substr($texte1, 0, $i);
/// => Traiter le cas d'un double retour à la ligne
$texte1 = eregi_replace("<br[ /]*>[ \n]*$", '', $texte1);
$texte1 = eregi_replace("<p>[ \n]*$", '', $texte1);
/// => Supprimer les espaces en fin de chaine
$texte1 = eregi_replace("[ \n]*$", '', $texte1);
/// => Récupérer la partie tronquée
$texte2 = substr($texte, strlen($texte1));
} else {
$texte1 = $texte;
$texte2 = '';
}
} else {
$texte1 = $texte;
$texte2 = '';
}
return array($texte1,$texte2);
}
?>