IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Tronquer un texte trop long avec …


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 21
    Points
    21
    Par défaut Tronquer un texte trop long avec …
    Bonjours.

    Je cherche à personnaliser le template d'une galerie photo PHP :

    Dans une DIV 1 positionnée sous une photo apparaît le nom du fichier photo.
    Malheureusement, si le nom du fichier est trop long, il dépasse le bord de la DIV 1.
    Je ne veux pas que le nom s'affiche sur autant de ligne que nécessaire car je souhaite que la DIV 1 conserve une hauteur donnée.
    J'ai trouvé la solution en donnant à la CLASS de ma DIV 1 les valeurs suivantes :
    overflow-x: hidden;
    white-space: nowrap;

    Ainsi, le nom de ma photo est bien tronqué et reste à l'intérieur de ma DIV 1

    Je souhaiterais cependant que le "tronquage" ainsi réalisé soit signalé par l'ajout de 3 petits points.
    Pour cela, j'envisage de superposer sur le bord droit de ma DIV 1 une nouvelle DIV 2 contenant les trois petits points. Pas de problème pour réaliser cela.

    Ma difficulté est : Comment déterminer si le nom de ma photo qui apparaît dans ma DIV 1 est ou non tronqué, et afficher alors ma DIV 2 contenant mes 3 petits points ?

    A moins qu'il existe une solution autre que la superposition de DIV ?

    Si besoin est, je signale :
    - qu'il m'est égal que l'ajout des 3 petits points se fasse en plein milieu du mot.
    - que j'ai cherché du côté de strlen() et substr() mais que les caractères de la police que j'utilise ayant une largeur différente, pour un même nombre de caractère, un fichier contenant beaucoup de i prendra moins de place à l'écran (et n'aura par suite pas besoin d'être tronquer) qu'un autre contenant beaucoup de m (qui lui en aura besoin)

    Vous voudrez bien excuser mon peu d'expérience en la matière.

    Espérant avoir sur clairement exposé mon problème
    Et vous remerciant par avance pour l'aide que vous voudrez bien m'apporter.

    Salutations à tous.

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Avec la fonction wordwrap() peut être :
    string wordwrap ( string str , int width , string break , bool cut )

    wordwrap retourne la chaîne str , après avoir inséré break tous les width caractères.

    Par défaut, wordwrap va automatiquement insérer une nouvelle ligne en utilisant \n tous les 75 caractères, si width ou break ne sont pas fournis.

    Si le paramètre cut est mis à 1, la césure de la chaîne sera toujours à la taille width . Si vous avez un mot qui est plus long que la taille de césure, il sera coupé en morceaux. (Voir le second exemple.)
    Note

    Le paramètre optionnel cut a été ajouté en PHP 4.0.3.

    Exemple avec wordwrap


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $text = "Portez ce vieux whisky au juge blond qui fume.";
    $newtext = wordwrap( $text, 20 );
     
    echo "$newtext\n";
    ?>
    Exemple avec wordwrap avec césure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    $text = "Un mot très très loooooooooooooooooong.";
    $newtext = wordwrap($text, 8, "\n", 1);
     
    echo "$newtext\n";
    ?>

  3. #3
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    wordwrap fait comme en CSS, il insère des sauts de ligne tous les n caractères, il ne tronque pas la chaine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function str_truncate($text, $length){
        if(strlen($text) <= $length) return $text;
        return trim(substr($text, 0, $length));
    }

  4. #4
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Merci pour l'idée du wordwrap, mais cela ne répond pas à mes attentes.

    J'ai finalement décidé d'abandonner l'idée de superposer une DIV contenant les ... et de me diriger vers la solution qui suit.

    Il s'agit d'une solution totalement empirique.

    J'ai bien conscience que les habitués du php risquent de trouver ma solution complètement inepte. Elle me permet cependant d'apporter une solution au problème que je rencontrai exposé ci-dessus.
    Je la livre donc à vos critiques.

    Je rappelle mon problème : Je dois écrire du texte à l'intérieur d'une DIV. Si ce texte est plus long que la largeur de la DIV, alors il doit être tronqué. Le "tronquage" doit être signalé par …

    Voilà la solution :
    J'ai d'abord pris le caractère de ma police le plus petit (Le i)
    J'ai ensuite tapé un texte ne contenant que des i pour déterminer le nombre maximum de caractères pouvant contenir à l'intérieur de ma DIV ($max_letters)
    J'ai classé toutes les lettres de l'alphabet, majuscule et minuscule à l'intérieur de tableaux en fonction de la largeur des lettres ($gl_x)
    Puis j'analyse dans une boucle for toutes les lettres de mon texte, et en fonction de la lettre, je détermine la taille taille de la lettre($width_x) et donc la taille totale du texte ($Total_width)
    Si la taille totale du texte est inférieurà la taille du nombre maximum de caractère, alors le texte sera affiché en entier. A défaut, le texte est tronqué [fonctin substr()] à la lettre à partir de laquelle la taille totale a dépassé la taille maximale ($stop_letters).

    Ne sachant si mes explications sont suffisamment, claires, je vous livre le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    <?php
     
    $gat="Mettre ici le texte à analyser";
     
    $max_letters = 11; //Le nombre maximum de caractères
     
    //Les tableaux de lettre en fonction de la largeur des lettres :
    $gl_1 = array("i","j","l","'");
    $gl_2 = array("r","f","t","I"," ");
    $gl_3 = array("a","b","c","d","e","g","h","k","n","o","p","q","s","u","v","x","y","z","J","L");
    $gl_4 = array("m","w","A","B","C","D","E","F","G","H","K","M","N","O","P","Q","R","S","T","U","V","X","Y","Z");
    $gl_5 = array("W");
     
    //La largeur des lettres selon le tableau dans lequel elles figurent
    $width_1 = 0.7;
    $width_2 = 0.9;
    $width_3 = 1.3;
    $width_4 = 1.8;
    $width_5 = 2;
    $width_other = 1;
     
    $strlen_gat=strlen($gat); //Nombre total de letttre que contient le texte
     
    //Initialisation
    $Total_width = 0;
    $stop_letters = 0;
    $break_for=0;
     
    //Boucle for de traitement de chaque lettre du texte :
      for($i=0;$i<=$strlen_gat;$i++) 
      { 
     
      if ($break_for==0) /*Ne plus analyser si taille déjà dépassée*/
      {
     
        //Déterminer de quel tableau dépend la lettre et ajouter sa largeur :
     
        $get_letter = $gat[$i]; 
     
        if(in_array($get_letter, $gl_1))
        {
          $Total_width = $Total_width + $width_1;
        }
        elseif(in_array($get_letter, $gl_2))
        {
          $Total_width = $Total_width + $width_2;
        }
        elseif(in_array($get_letter, $gl_3))
        {
         $Total_width = $Total_width + $width_3;
        }
        elseif(in_array($get_letter, $gl_4))
        {
          $Total_width = $Total_width + $width_4;
        }
        elseif(in_array($get_letter, $gl_5))
        {
          $Total_width = $Total_width + $width_5;
        }
        else
        {
          $Total_width = $Total_width + $width_other;
        }
     
        $stop_letters++; //Détermination de la lettre où s'effectuera le tronquage
        if ($Total_width>$max_letters){$break_for=1;}
     
      }
     
      }
     
    //Tronquer si nécessaire
    if ($Total_width > $max_letters)
    {
    $gat = substr($gat, 0, $stop_letters)." ...";
    }
     
    //Ecriture du texte entier ou tronqué dans la DIV
    echo '<div class="c"><h4 class="box title">'.$gat.'</h4></div>';
     
    ?>
    Voilà. Si cela peu servir à d'autre ...

    Surtout n'hésitez pas à me proposer de meilleures solutions, ou des améliorations.

    A+

  5. #5
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonsoir,

    Ta solution est beaucoup trop compliqué pour pas grand chose.

    Mets tes tailles de police en % et non en pixel puis utilise le code que j'ai donné plus haut. Tu tronques sur un nombre de caractères qui te parait raisonnable et qui ne sortirait pas de ton div.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo str_truncate($machaine, 10).'...';

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Effectivement cette solution est beaucoup plus simple, mais elle ne répond pas à mes attentes, même en exprimant la taille de la font en % et non plus en px (du moins dans mon cas).

    Je donne un exemple :
    Si le texte à afficher dans la DIV est le suivant :
    $machaine = "NOM DE FICHIER"
    Ce texte est effectivement trop long.
    Grace à la fonction str_truncate($machaine, 8).'...', est effectivement affiché dans ma DIV le texte : NOM DE F…
    Mais si le texte à afficher dans la DIV est le suivant :
    $machaine = "nom de fichier"
    Ce texte n'est pas trop long (car les minuscules ont une taille plus petite que les majuscules) et il n'y aurait pas lieu de le tronquer. Cependant, l'utilisation de la fonction str_truncate($machaine, 8).'...', fait qu'est affiché dans ma DIV le texte : nom de f…

    C'est pourquoi il me semble que je dois analyser chaque caractère de la chaine à afficher pour déterminer sa taille et savoir ainsi si la taille additionnée des caractères de la chaine dépasse ou pas la taille maximale que la DIV permet d'afficher.

    Merci en tout cas pour les remarques.

  7. #7
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    Une possibilité serait de faire des testes avec via la fonction
    imageftbbox. Cette fonction "Calcule le rectangle d'encadrement pour un texte, en utilisant la police courante et freetype2".

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 11
    Points
    11
    Par défaut fonction truncate
    tu peura utiliser cette fonction pour résoudre ton problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <?php
     
    function truncate($string, $max_length = 30, $replacement = '', $trunc_at_space = false)
    {
    	$max_length -= strlen($replacement);
    	$string_length = strlen($string);
     
    	if($string_length <= $max_length)
    		return $string;
     
    	if( $trunc_at_space && ($space_position = strrpos($string, ' ', $max_length-$string_length)) )
    		$max_length = $space_position;
     
    	return substr_replace($string, $replacement, $max_length);
    }
     
    ?>
    et pour l'utiliser il suffit de l'appeler de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
     
    $str = "salut tout le monde ,je suis la encore une fois";
    $str = truncate($str, 20, '...', true);
    echo $str; // salut tout le monde ...
     
    ?>

    et voila c'est résolu!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Dojo] Tronquer texte trop long dans les listes (dojox.mobile)
    Par NeedV dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 25/04/2012, 18h40
  2. Tronquer automatiquement un texte trop long
    Par adilassadi dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2007, 00h49
  3. Réponses: 2
    Dernier message: 29/08/2006, 16h18
  4. textbox et onKeyUp event -> largeur augmente auto quand texte trop long
    Par Miketrix dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 25/07/2006, 11h14
  5. [CSS]Tronquer un libellé trop long
    Par Salam59 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 24/03/2006, 12h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo