Raccourcir une chaine de caractères à des endroits divers et variés

Voici une fonction qui vous permettra de raccourcir une chaine de caractères en enlevant tout ce qui dépasse du début, de la fin, du milieu ou de toute autre position, ajoutant quelques petits points à l'endroit de la suppression. Cela peut être pratique lorsque l'on a pas trop de place pour afficher le titre d'un article par exemple.

<?php

function wd_shorten($str$length=32$position=.75&$shortened=null)
{
    $l = mb_strlen($str);

    if ($l <= $length)
    {
        return $str;
    }

    $length--;
    $position = (int) ($position * $length);

    if ($position == 0)
    {
        $str = '…' . mb_substr($str$l - $length);
    }
    else if ($position == $length)
    {
        $str = mb_substr($str0$length) . '…';
    }
    else
    {
        $str = mb_substr($str0$position) . '…' . mb_substr($str$l - ($length - $position));
    }

    $shortened = true;

    return $str;
}

Quelques raccourcissements

Amusons-nous avec le titre de l'article :

<?php

$str = "Raccourcir une chaine de caractères à des endroits divers et variés";

var_dump(wd_shorten($str320));
var_dump(wd_shorten($str32, .25));
var_dump(wd_shorten($str32, .5));
var_dump(wd_shorten($str32, .75));
var_dump(wd_shorten($str321));
string '…à des endroits divers et variés' (length=36)
string 'Raccour…ndroits divers et variés' (length=35)
string 'Raccourcir une …divers et variés' (length=35)
string 'Raccourcir une chaine d…t variés' (length=35)
string 'Raccourcir une chaine de caract…' (length=34)

Bon, var_dump() rapporte n'importe quoi parce que les chaines sont en utf-8… notre œil expert aura fait la part des choses.

Description des paramètres

Comme vous l'avez compris, le paramètre position permet de définir l'endroit où les caractères doivent disparaitre. La position est définie par un nombre à virgule entre 0 et 1. Ce qui permet de supprimer les caractères du début (0), de la fin (1), du milieu (.5) ou d'autres positions inexplorées comme vers le début (.25).

Le paramètre shortened peut être utilisé pour savoir si la chaine a vraiment été raccourcie, ce que l'on peut aussi facilement savoir en comparant la chaine originale et le résultat  :

<?php

wd_shorten($str32, .75$shortened)// shortened = true
wd_shorten($str3200, .75$shortened)// shortened = false

La même chose en Javascript ?

Pour ne pas faire de jaloux, je vous propose la même fonctionnalité pour Javascript. Le code que je vous présente ajoute la méthode shorten à l'objet natif String en utilisant la méthode implement ajoutée par MooTools, cepandant le code n'est pas dépendant de MooTools, et vous pourrez sortir la méthode shorten pour en faire une fonction gloable si ça vous chante.

String.implement
({
    
    shorten: function(length, position)
    {
        if (length === undefined)
        {
            length = 32;
        }
        
        if (position === undefined)
        {
            position = .75;
        }
        
        var l = this.length;
        
        if (l <= length)
        {
            return this;
        }
        
        length--;
        position = Math.round(position * length);
        
        if (position == 0)
        {
            return '…' + this.substring(l - length);
        }
        else if (position == length)
        {
            return this.substring(0, length) + '…';
        }
        else
        {
            return this.substring(0, position) + '…' + this.substring(l - (length - position)); 
        }
    }
});

Voilà, vous savez tout. Alors, qu'ils soient divers ou variés, raccourcissez aux endroits que vous aimez. (rime !)

Laisser un commentaire

Pas de commentaire