Éviter la déformation d'un tableau html en découpant une chaine

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 162 fois - Téléchargée 28 fois


Contenu du snippet

voici un code pour éviter que les longs mots ne viennent foutre le bordel dans le design d'un site (je pense aux tableaux en particulier)
ben oui, y'a toujours un gros lourd qui va se mettre un pseudo très long ou dans un forum un message avec des mots de 30 caractères du genre

waaaaaaaaaaaaaaaaaaaaaaazzzzzzzzzzzzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

le résultat est pas très joli (enfin c'est surtout le webmaster qui va faire la gueule lol)

ce code est une fonction qu'on appelle par:

echo format_chaine($chaine,$longueur);

$chaine: la chaine string à traiter
$longueur: longueur maximale d'une ligne

voici un exemple:

$chaine="coucou blablablablablablablablabla il fait beau, les oiseaux chantent lol";
$longueur=20;

la fonction va renvoyer ceci:

coucou blablablablab
lablablablabla
il fait beau, les
oiseaux chantent lol

bon c pas très jolie mais bon bref...

Source / Exemple :


<?
function format_chaine($chaine,$longueur){
    $chaine=trim($chaine); //vire les espaces en début et fin de chaine
    $chaine=strtr($chaine,array_flip(get_html_translation_table(HTML_ENTITIES))); //vire les cars html qui vont perturber le comptage des lettres
    $mots=explode(' ',$chaine); //sépare tous les mots
    $nb_mots=count($mots); //compte le nb de mots
    $pos=0;
    for($i=0;$i<=$nb_mots-1;$i++){
        if(strlen($mots[$i])>$longueur){ //si le mot rentre pas sur une seule ligne
            $debut=0;
            if($longueur-strlen($ligne[$pos])>=$longueur/3){ //si il reste plus d'un tiers de la ligne dispo
                $debut=$longueur-strlen($ligne[$pos]);
                $ligne[$pos].=substr($mots[$i],0,$debut); // on place sur cette ligne le début du mot
            }
            $nb_lignes=ceil((strlen($mots[$i])-$debut)/($longueur-1)); //nb de lignes nécessaires pr ce mot
            for($j=0;$j<=$nb_lignes;$j++){
                $ligne[$pos].=substr($mots[$i],$debut,$longueur); //on découpe ce mot sur le nb de lignes nécessaires
                $debut+=$longueur;
            }
        }else{ //si le mot rentre sur une ligne
            if(strlen($ligne[$pos])+strlen($mots[$i])<=$longueur){ //y'a encore de la place sur cette ligne?
                $ligne[$pos].=$mots[$i].' '; //oui: on y ajoute le mot
            }else{ //non: on ajoute le mot sur une autre ligne
                $pos++;
                $ligne[$pos].=$mots[$i].' ';
            }
        }
    }
    for($i=0;$i<=count($ligne)-1;$i++){ //on remet les caractères html
        $ligne[$i]=htmlentities($ligne[$i]);
    }
    $resultat=implode("<br>\n",$ligne); //on crée une chaine toute propre
    return $resultat;
}
?>

Conclusion :


note: avant de traiter la chaine, le texte est débarrassé des caractères html pour éviter de compter 7 caractères pour é au lieu de 1 seul (é)

je me suis inspire de qq messages sur le forum pr faire cette source, mais elle me parait bien longue pour ce qu'elle fait, il doit y avoir un moyen de faire + siimple je pense

A voir également

Ajouter un commentaire

Commentaires

cs_stailer
Messages postés
511
Date d'inscription
jeudi 28 mars 2002
Statut
Membre
Dernière intervention
13 mai 2009
1 -
Pourquoi pas... Du moins le code source est intéressant.
Sinon au niveau utilité y a beaucoup plus simple :
Sur le formulaire ou l'utilisateur rentre son nom ou son email, il suffit de définir le nombre de caractères maximal à 20 par exemple dans le champ de saisi (propriété maxlength en html).
cs_Tortuegeniale
Messages postés
1123
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
26 juin 2008
1 -
ouah super simple, ensuite suffit de passer le champ par l'url ou par un programme spécial et ta super sécurité marche pas, de plus tu as pas compris la source, ça sert a pas déformer un tableau, et la max lenght ne sert a rien ici :|
cs_stailer
Messages postés
511
Date d'inscription
jeudi 28 mars 2002
Statut
Membre
Dernière intervention
13 mai 2009
1 -
Je ne parlai pas de l'intérêt de la source sur les tableaux mais sur la protection d'un nombre maximal de caractères.

Dans ces cas la il suffit de faire sur la page de réception en php, avant l'insertion, que si le nombre de caractère de la variable "nom" est plus grand que 30 par exemple, ben annuler l'insertion.
Ceci évite les gros lourds comme le dis Eax et les empêche de pourrir la base.
Enfin bon... ca dépend si on veut des lourds ou pas sur son site :)
cs_Clem
Messages postés
282
Date d'inscription
dimanche 1 avril 2001
Statut
Membre
Dernière intervention
12 février 2007
-
en tout cas, je préfère utiliser les preg, qui sont beaucoup plus rapide que des boucles caractères par caractères :
function coupemot($m, $l) {
for ($i=0; $i<20; $i+=$l) $r.=substr($m, $i, $l)." ";
return $r;
}
function format_chaine($c,$l) {
return preg_replace("/([^ ]{" . $l . ",})/Ue", "coupemot('\1', $l)", $c);
}
cs_Tortuegeniale
Messages postés
1123
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
26 juin 2008
1 -
:| c pas le nombre maxi de caractere qu'il limite avec sa source, c le nombre de caractere par ligne

Eax> j'ai fais une source je la poste la, parceque ta source comporte des erreurs (par exemple ça respect pas la mise ne forme)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.