Jump to content
Sign in to follow this  
Bug

Couper un texte

Rate this topic

Recommended Posts

Bonjour

Pour couper un texte, j'utilise la fonction suivante:

     	 <?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 é , 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 ?

Share this post


Link to post
Share on other sites

explode ou implode pourrait t'aider, je pense.

A tester...

xpatval

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
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 ?

Share this post


Link to post
Share on other sites

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:

$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. ;)

xpatval

Share this post


Link to post
Share on other sites

je teste ça demain et je te tiens au courant

bonne nuit

Share this post


Link to post
Share on other sites

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

	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 ;)

Share this post


Link to post
Share on other sites

Salut

J'ai trouvé une autre solution:

// 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 :hourra:

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>

Edited by Bug

Share this post


Link to post
Share on other sites

Bonjour,

Pourquoi se casser le crâne alors qu'il y a déjà une fonction pour :fou:

wordwrap()

Exemple : dans mes pages je fait ça :

wordwrap(stripslashes($titre),40,"<br />",1)

Et ça marche très bien :fete:

Voir exemple ici : Omelette aux courgettes et aux herbes de provence (le titre de la recette en H1)

Edited by vanquish

Share this post


Link to post
Share on other sites

Salut, et désolé pour la réponse tardive, je viens juste de tomber sur ton post :blush:

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
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:

Je vais quand même essayer, ça vaut surement le coup.

Share this post


Link to post
Share on other sites

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 ;)

Share this post


Link to post
Share on other sites

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:

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:

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:

Enveloppez la prise avec le nombre de caractères choisis en utilisant

un caractère de la rupture à chaînes

Share this post


Link to post
Share on other sites

Comme tu dis, ca doit sortir d'un traducteur automatique. Il faut donc, puisque c'est de l'anglais, traduire de droite à gauche :

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 :

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 ?

;)

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...