9 juillet 2010

Le raccourcissement d’un texte trop long en PHP

Il arrive souvent qu’un texte doit être écourté avant son affichage. Par exemple, si vous voulez afficher sur votre page d’accueil un extrait du contenu d’une nouvelle récente qui est très long, vous devrez couper votre texte après un nombre défini de caractères ou de mots.

"Kryzalid Communication lance son blog dans la controverse !

Non il n'y pas eu de controverse, c'était seulement pour attirer votre attention ;) . Par contre, nous avons vraiment un blog et nous vous invitons à le visiter au blog.kryzalid.net (sans les www). Vous constaterez... voir plus"

PHP propose une fonction native pour saisir une portion de texte dans une chaîne : substr(). Dans l’exemple suivant, nous voulons couper le texte après 30 caractères :

<?php
$chaine = "Kryzalid Communication lance son blog dans la controverse";
echo substr($chaine, 0, 30) . "...";

// Résultat :
// Kryzalid Communication lance so...
?>

Comme vous voyez, la chaîne est coupée au milieu d’un mot, ce qui n’est pas très élégant. Évidemment, ce n’est pas le comportement désiré. Ce que vous voulez, c’est de couper le texte, à une longueur donnée, mais aussi entre deux mots (dans un espace).

Nous vous proposons donc deux méthodes pour y arriver :

Méthode 1 : Racourcissement selon un nombre maximum de caractères :

<?php
function reduireChaineCar($chaine, $nb_car, $delim='...') {
  $length = $nb_car;
  if($nb_car<strlen($chaine)){
  while (($chaine{$length} != " ") && ($length > 0)) {
   $length--;
  }
  if ($length == 0) return substr($chaine, 0, $nb_car) . $delim;
   else return substr($chaine, 0, $length) . $delim;
  }else return $chaine;
}

// Exemple
$chaine = "Kryzalid Communication lance son blog dans la controverse";
echo reduireChaineCar($chaine, 30) ;

// Résultat :
// Kryzalid Communication lance...
?>

Dans cet exemple, le texte $chaine est coupé, dans un espace, après 30 caractères. Bien entendu, si la trentième position de la chaîne n’est pas un espace, la fonction recule dans le texte jusqu’à ce qu’elle trouve un espace (entre « son » et « blog ») et ajoute le délimiteur (…).

Méthode 2 : Racourcissement selon un nombre maximum de mots :

<?php
function reduireChaineMot($chaine, $nb_mots, $delim='...') {
{
  $stringTab=explode(" ", $chaine) ;
  for($i=0;$i<$nb_mots;$i++){
    $txt.=" ".$stringTab[$i] ;
  }
  if (count($stringTab) > $nb_mots) $txt.= $delim ;
  return $txt ;
}

// Exemple
$chaine = "Kryzalid Communication lance son blog dans la controverse";
echo reduireChaineMot($chaine, 6) ;

// Résultat :
// Kryzalid Communication lance son blog dans...
?>

Dans cet exemple, le texte $chaine est coupé, après six mots et ajoute le délimiteur (…).

Mise en garde : Ces fonctions ne doivent pas être utilisées si votre texte est au format HTML. Elles risquent de couper le texte de façon à ce que les balises HTML deviennent invalides et altérer votre mise en page.

Bon rétrécissement!

Mots-clés : , , , ,

Le commentaires sont fermés.