Version complète: sur le forum Webmaster Hub : Couper un texte
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Bug
Bonjour

Pour couper un texte, j'utilise la fonction suivante:
CODE
         <?php $newarticle = substr($row_news['news_texte'], 0, 150);
         echo $newarticle ?> ...

Le problème est que si je tombe au milieu d'un caractère codé genre &eacute; , je vous laisse imaginer le résultat de l'affichage.
J'ai donc cherché la solution pour supprimer les caractères qui suivent le premier blanc rencontré à partir de la fin, mais je ne trouve pas la solution sur le peu de sites consacrés au PHP que je connais ...
Quelqu'un aurait une idée ?
xpatval
explode ou implode pourrait t'aider, je pense.
A tester...

xpatval
xpatval
En fait, plutôt qu'explode(), nous allons utiliser strtok()

CODE
news_texte = "blabla blibli bloblo...";
$delimiteur = strtok($news_texte," ");
$cpt = 0;
for ($cpt = 0; $cpt < 30; $cpt++)
{
    echo $delimiteur ." ";
    $delimiteur = strtok(" ");
}

Ici, c'est le nombre de blancs entre deux mots, géré par $cpt, qui est à régler en fonction du nombre de mots que tu souhaites récupérer.

xpatval
Bug
CITATION
Ici, c'est le nombre de blancs entre deux mots, géré par $cpt, qui est à régler en fonction du nombre de mots que tu souhaites récupérer

Donc, dans ce cas, si j'ai bien compris, je crée un tableau avec un mot par sous-chaine, puis je reconstitue ma chaîne jusqu'à la valeur maxi de $cpt (30 dans ton exemple).
J'ai juste ?
Comme le nombre de mots est très variable dans ma chaîne de 150 caractères, je dois pouvoir compter le nombre de blancs avec une fonction genre substr_count pour alimenter une variable et remplacer le '< 30' qui est arbitraire par '< $variable' non ?
xpatval
Effectivement, je pense que tu peux procéder ainsi. Dans mon exemple, $cpt est le nbre de blanc. Si tu peux le renseigner en fonction de tes désidératas, tu peux reconstituer la chaîne avec le nombre de blancs voulu, dans un nombre de caractères voulu.

je pense qu'un truc comme:
CODE
$cpt = substr_count(substr($row_news['news_texte'], 0, 150)," ");
doit te donner le nombre de blancs de ta sous-chaîne de 150 caractères.

Tu me diras si cela fonctionne. wink.gif

xpatval
Bug
je teste ça demain et je te tiens au courant

bonne nuit
Dan
Voici ce que j'utilise sur lisons.info pour les résumé de biographies (marge droite sur fiche des livres)

CODE
    function shorten($text,$maxTextLenght) {
     if(strlen($text) > $maxTextLenght ) {
     $text = substr(trim($text),0,$maxTextLenght);
     $text = substr($text,0,strlen($text)-strpos(strrev($text)," "));
     }
 $text = ereg_replace("\r\n"," ",$text);
 return $text." ...";
    }

A adapter selon vos besoins wink.gif
Bug
Salut

J'ai trouvé une autre solution:
CODE
// recuperation des 150 premiers caractères
<?php $newart = substr($row_news['news_texte'], 0, 150);

// strrpos recherche la position du premier caractère blanc à partir de la fin
$pos = strrpos($newart, " ");

// je redécoupe ma chaîne avec comme nombre de caractères la variable alimentée par strrpos
$newarticle = substr($newart, 0, $pos);

//j'affiche ma nouvelle chaîne
echo $newarticle; ?> ...


Ca fonctionne très bien IMSTP3.gif

Merci à Dan et xpatval pour leurs solutions.
Si vous avez des arguments pour montrer que votre solution est meilleure, n'hésitez pas

<edit>le résultat est visible ici: h..p://www.desmobug.net/index1.php (la partie Compétition moto - Les dernières nouvelles)</edit>
vanquish
Bonjour,
Pourquoi se casser le crâne alors qu'il y a déjà une fonction pour IMSTP6.gif
wordwrap()
Exemple : dans mes pages je fait ça :
CODE
wordwrap(stripslashes($titre),40,"<br />",1)

Et ça marche très bien IMSTP2.gif
Voir exemple ici : Omelette aux courgettes et aux herbes de provence (le titre de la recette en H1)
Bug
Salut, et désolé pour la réponse tardive, je viens juste de tomber sur ton post blush.gif

C'est vrai que c'est simple quand on a l'exemple, mais je ne me souviens même pas d'avoir vu cette instruction sur mes manuels.
Par contre, en la connaissant, on la trouve facilement ...

Personne ne connaitrait un bon manuel php avec les fonctions classées par thème ?

Merci Vanquish pour ta solution, je m'y colle demain.
Anonymus
En fait, dans la doc officielle, ils sont classés par thème. Tu as les variables, les tableaux, etc.. mais tu as aussi les lecture/ecriture dans les fichiers, les fonctions apache, les pdf, etc.. bref, c'est classé par thème.

En fait, bien souvent, on se réfère à un manuel que l'on pense complet, parce que bien épai, alors que le plus épai reste la doc officielle, qu'il est bon de parcourir "tel un surfeur sur le net", et se laisser promener au fil des pages, pour justement trouver ces fonctions peu utilisées mais fort utiles, que l'on saura retrouver par la suite.

Nico.
Bug
CITATION
parcourir "tel un surfeur sur le net", et se laisser promener au fil des pages

Dit comme ça, ça pourrait le faire, mais j'ai peur d'avoir des problèmes de digestion à force de lire des descriptions de fonctions qui sont parfois un peu lourdes ... sick.gif
Je vais quand même essayer, ça vaut surement le coup.
Dan
Salut Vanquish,

La fonction wordwrap ne coupe pas un texte mais garde l'entièreté de celui-ci en rajoutant des sauts de ligne à la longueur voulue.

Ton exemple sur cuisinetoo met en page un texte pour forcer les sauts de ligne, mais ne raccourcit pas le texte initial.

Dan wink.gif
Bug
Si je prends le O'Reilly de poche intégré à Dreamweaver (tiens, lui aussi est classé par thème, j'ai pas dû l'ouvrir souvent celui ci ... ) il est écrit:
CITATION
wordwrap
string wordwrap (string str[, int width[, string break [, int cut]]])
Enveloppe le tampon avec le nombre de caractères choisi à l'aide d'un caractère de rupture de chaîne


L'exemple typique d'explication que je trouve indigeste sick.gif
Sans rire, il n'y a pas de façon plus simple de décrire cette fonction ? C'est traduit de l'anglais par le traducteur automatique de Ya..o ?

Pour le fun, j'ai traduit la description en anglais sur Y... puis retraduit en français après, et le résultat est le suivant:
CITATION
Enveloppez la prise avec le nombre de caractères choisis en utilisant
un caractère de la rupture à chaînes
Anonymus
Comme tu dis, ca doit sortir d'un traducteur automatique. Il faut donc, puisque c'est de l'anglais, traduire de droite à gauche :
CITATION
Enveloppe le tampon avec le nombre de caractères choisi à l'aide d'un caractère de rupture de chaîne

un caractère de rupture de chaine = <br>
le nombre de caractères choisi = à combien de lettres tu veux que ca coupe,
enveloppe le tampon = Souvent, la sortie générée est appelée 'tampon'. (en anglais : buffer)

Donc, ca prend ce qui va être envoyé au navigateur, ca le décompose en xx caractères, et ca y inclue un caractère de rupture de chaine.

En "doc-fr", ca donne :
CITATION
string wordwrap ( string str [, int width [, string break [, boolean 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 tous les 75 caractères, si width et break ne sont pas fournis.

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


Beaucoup plus simple, non ?

wink.gif
Bug
Merci Anonymus, c'est beaucoup plus clair comme ça.

C'est vrai que dans le domaines de la programmation cobol/mainframe, on a rarement l'occasion de parler de buffer ...

Encore merci pour la traduction.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.