Aller au contenu

Couper un texte


Bug

Sujets conseillés

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 ?

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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 ?

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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 ;)

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

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>

Modifié par Bug
Lien vers le commentaire
Partager sur d’autres 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)

Modifié par vanquish
Lien vers le commentaire
Partager sur d’autres sites

  • 5 semaines plus tard...

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.

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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 ;)

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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 ?

;)

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...