Blog / Article #9
Racourcir une chaine [Script PHP]

star

14 Novembre 2012

Racourcir une chaine [script php]

Racourcir une chaine [Script PHP]

 Quand on a besoin de couper une chaine de caractère (dans le but de la raccourcir), par exemple pour n'afficher que la première ligne d'un paragraphe, on a souvent plusieurs choix. En voici quelques uns.

Couper avec substr()

Utiliser la bonne vielle fonction substr()  en est une assez radicale

(peu être un peu trop non ? ^^)

    function decouper($chaine = '', $taille=50,$fin='...'){
        if (strlen($chaine)>$taille){
            return substr($chaine,0,$taille).$fin;
        }
        else { 
            return $chaine;
        }
    }

Rajoutation de wordwrap() et strpos()

On a vu mieux alors on pourrait peut être ajouter à ça la fonction wordwrap()  histoire de pré-découper la chaine. Cela va avoir l'effet direct de rajouter des retours chariots '\n' tous les x caractères. Ensuite, on aura juste a couper du début de la chaine jusqu'au premier retour chariot rencontré. On trouvera cette position grâce à strpos() .

 
    function decouper($chaine = '', $taille=50,$fin='...'){
        if (strlen($chaine)>$taille){
            $chaine = wordwrap($chaine, $taille);
            return substr($chaine,0,  strpos($chaine, '\n')).$fin;
        }
        else { 
            return $chaine;
        }
    }

Cette deuxième méthode est beaucoup plus lente, (environ 2 fois) mais ça ne se ressent pas vraiment (on parle de micro-secondes). Par contre l'inconvénient de cette dernière, c'est qu'elle va couper la chaine prématurément si elle rencontre un retour chariot avant celui créé par le wordwrap()... bah ouai ! :-( 

Un peu plus avancé...

Alors on pourrait filtrer la chaine en enlevant les retours avant de la passer dans la fonction etc etc... mais il existe une solution plus... chiante complète qui consiste à éclater la chaine à chaque espaces,nouvelle lignes ou retours chariots avec preg_split()  et retourner le tout dans un tableau. Il suffit ensuite de déterminer jusqu’à quel index du tableau il faudra se rendre pour arriver à notre limite de caractères, en bouclant sur chacune de ses valeurs et en additionnant et comparant leur taille avec la taille désirée. Une fois cet index en poche, il ne reste qu'a extraire les valeurs nécessaires avec un array_slice() et de reconstituer une chaine avec un implode() :)        

function decouper($chaine = '', $taille = 50, $fin = '...') {
    $tab = preg_split('/([\s\n\r]+)/', $chaine, null, PREG_SPLIT_DELIM_CAPTURE);
    $taille_comparaison = 0;
    $eclat = 0;
    for (; $eclat < count($tab); ++$eclat) {
        $taille_comparaison += strlen($tab[$eclat]);
        if ($taille_comparaison > $taille)
            break;
    }
    return trim(implode(array_slice($tab, 0, $eclat))).$fin;
}

Bon alors la c'est sur c'est plus lent que les autres mais au moins le travail est bien fait et j'ai pas de questions à me poser sur la forme de la chaine que j'envoie.

Aller hop Validé !  :-)


Je pense que tu devrais mettre un +1

Auteur de l'article
Retour a la liste