tronquer un texte

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : tronquer un texte

Re: tronquer un texte

par cmoi » 13 janv. 2010, 13:52

merci pour cette correction ; je vais me résoudre à installer Notepad !

PS pour l'affichage, ce n'est pas cellpading mais cellspacing qu'il faut utiliser !

Re: tronquer un texte

par macgawel » 13 janv. 2010, 12:28

$sql = "SELECT * FROM " . $table. " where id=".$_GET['id']." ;
Le problème vient des guillemets à la fin.

Trouvé en 5 sec. avec Notepad++ :P
Et en regardant le code ici, on voit aussi le problème :
        $sql = "SELECT * FROM " . $table. " where id=".$_GET['id']." ; // erreur
    $res = mysql_query($sql);
        $sql = "SELECT * FROM " . $table. " where id=".$_GET['id']; // correct
    $res = mysql_query($sql);

Re: tronquer un texte

par cmoi » 12 janv. 2010, 20:05

ok le script n'était pas bon sur fiche-article.php. J'ai remplacé parcelui-ci
          <?php 
    $table = "articles"; 
	$sql = "SELECT * FROM " . $table. " where id=".$_GET['id']." ; 
    $res = mysql_query($sql); 
	$nb = mysql_num_rows($res);
    $i = 0; 
	   while ($i < $nb)
	   { 
	   echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#666666"><b> '.mysql_result($res, $i, "nom").'</b></font><br />';
	   echo '<font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#666666"> '.mysql_result($res, $i, "texte").'</font><br />';
	 $i++; 
    } 
          ?>
qui ne fonctionne pas non plus. Il fonctionne pourtant sur une autre page au fonctionnement identique.
J'ai vérifié le nom de la table et des champs. Je vois pas quoi d'autre !

Je m'aperçois que les 2 lignes echo n'ont pas la même coloration syntaxique ; je ne vois pourtant pas de différences.

Re: tronquer un texte

par Ryle » 12 janv. 2010, 16:52

Ben dans ta page "fiche-article.php" qui va normalement ouvrir l'article demandé par l'utilisateur (et dont l'identifiant devrait être passé dans l'url), il doit y avoir un problème. En effet, au lieu de récupérer l'id passé dans l'url et d'afficher l'article correspondant, il affiche encore et toujours le même article.

Donc soit cet article est écrit en dur dans ta page, et du coup, ben c'est normal qu'il apparaisse à chaque fois... soit ton script interroge la base pour afficher un article, mais ne passe dans la requête sql l'identifiant de l'article à afficher, ou passe toujours le même identifiant (ou un autre problème du genre), et du coup la base renvoi toujours le même article :)

Re: tronquer un texte

par cmoi » 12 janv. 2010, 09:53

Ton code est bon et les ids des liens sont corrects. Ce qui ne l'est pas en revanche c'est ton script "fiche-article.php" qui affiche toujours le même article quel que soit l'id spécifié dans l'url (voire même si aucun id n'est spécifié dans l'url ;))
l'url est correcte. Que veux-tu dire par "ton script" ?

Re: tronquer un texte

par Ryle » 11 janv. 2010, 23:05

Ton code est bon et les ids des liens sont corrects. Ce qui ne l'est pas en revanche c'est ton script "fiche-article.php" qui affiche toujours le même article quel que soit l'id spécifié dans l'url (voire même si aucun id n'est spécifié dans l'url ;))

Re: tronquer un texte

par cmoi » 11 janv. 2010, 22:45

echo '<div align="right"><a href="fiche-article.php?id='.$row['id'].'">lire la suite</a></div>';
Effectivement, ce code m'affiche bien l'id correspondant à l'article. Pourtant les liens renvoient tous vers le même article !
voir la page www.sud-network.com/index2.php

Re: tronquer un texte

par Ryle » 11 janv. 2010, 21:09

C'est peut-être parce que l'id à afficher dans le lien devrait être l'id respectif de chacun des articles et non pas une valeur récupérée en get sur une page qui s'ouvre sans qu'on lui passe de paramètre ? ;)

Quelque chose comme ça serait sans doute plus approprié (si le champ de ta bale s'appelle bien "id" évidemment :))
echo '<div align="right"><a href="fiche-article.php?id='.$row['id'].'">lire la suite</a></div>';
@Aureusms : elle est plus normande que -sounette ta classe non ? ;)

Personnellement je me contente d'une petite fonction :
function truncate($string, $size) {
	if (strlen($string) <= $size) // pas de modif
		return $string;

	$string = substr($string, 0, $size); // coupe la chaine à la taille max désirée

	// recherche le dernier espace (s'il y en a un)
	$lastSpace = (strrpos($string, ' ')) ? strrpos($string, ' ') : strlen($string); 

	// retourne la chaine coupée proprement (au dernier espace), suivi des points de suspension
	return substr($string, 0, $lastSpace) . '...';
}

Re: tronquer un texte

par cmoi » 11 janv. 2010, 19:22

echo '<div align="right"><a href="fiche-article.php?id='.$_GET['id'].'">lire la suite</a></div>';
La valeur id n'est pas récupérée. Il manque sûrement quelque chose avant. Mais quoi ?

Question subsidiaire : les colonnes sont très serrées, comment arranger cela ? J'ai essayé de placer dans <table> un cellpading mais ça n'a rien changé.
page actuelle : www.sud-network.com/index2.php

Re: tronquer un texte

par Aureusms » 11 janv. 2010, 17:25

Ferme ta balises :
echo '<a href="fiche-article.php?id='.$_GET['id'].'">lire la suite</a>';

Re: tronquer un texte

par cmoi » 11 janv. 2010, 16:28

j'ai essayé ça :
$cellule .= substr($row['texte'], 0, 400).'...'; 
ça marche, même si effectivement ça coupe les mots !

Je voudrais mettre un lien. Ce code ne va pas :
echo '<a href="fiche-article.php?id=".$_GET['id']."'.'lire la suite'.'</a>';

Re: tronquer un texte

par Aureusms » 11 janv. 2010, 13:33

Comme ton cas m'intéresse pour un de mes sites, j'ai concocté une petite classounnette normande. Dis moi si cela t'intéresse :

Pour appeller la class :
$texte_lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum laoreet scelerisque convallis. Nulla enim felis, rhoncus pharetra sollicitudin venenatis, facilisis eu erat. Donec volutpat erat vel erat pharetra sed eleifend est tincidunt. Maecenas vestibulum, elit vitae congue rhoncus, dui nunc gravida elit, sit amet porttitor dolor leo a quam. Duis augue odio, aliquam non tempor nec, semper at urna. Ut eget aliquet elit. Donec id fermentum nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque viverra facilisis risus, vitae sagittis lectus mollis at. Nam vestibulum imperdiet nibh et sodales. Mauris urna lorem, gravida sit amet elementum sit amet, hendrerit vitae felis. Donec ipsum nunc, laoreet interdum hendrerit a, iaculis et eros. In egestas ipsum vitae nisi lobortis tincidunt. Praesent non nunc sit amet nulla lobortis ultricies id nec massa. Maecenas tincidunt massa eu magna tempus consectetur. Nunc eget turpis et odio interdum sagittis eget in augue. Vivamus a eros in est luctus viverra et non nisi. Sed posuere mi vulputate erat pellentesque ultricies.";
$texte = new affiche_ligne_tronquee;
$texte->texte = $texte_lorem;
$texte->nombre_caractere = 100;
$tab_retour = $texte->retourne_ligne_tronquee();
foreach ($tab_retour as $cle => $valeur)
{
	echo strlen($valeur).' '.$valeur.'<br />';
}
El la class :
<?php
class affiche_ligne_tronquee
{
	var $texte = "";
	var $nombre_caractere = 400;
	var $nombre_ligne = 3;
	
	function retourne_ligne_tronquee ()
	{
		if (strlen($this->texte) <= $this->nombre_caractere)
		{
			$tab_sortie[0] = $this->texte;
			return $tab_sortie;
		}
		else
		{
			if (is_numeric($this->nombre_caractere))
				$this->nombre_caractere = intval($this->nombre_caractere);
			else
				$this->nombre_caractere = 400;
			if (is_numeric($this->nombre_ligne))		
				$this->nombre_ligne = intval($this->nombre_ligne);
			else
				$this->nombre_ligne = 3;				
			$caractere_maximum = intval($this->nombre_caractere * ($this->nombre_ligne+1));
			
			if (strlen($this->texte) > $caractere_maximum)
				$this->texte = substr($this->texte,0,$caractere_maximum);
			
			$tab_texte_temp = explode (" ",$this->texte);
			$tab_sortie= array();
			foreach ($tab_texte_temp as $cle => $valeur)
			{
				if (!empty($valeur))
					$tab_texte[$cle] = trim($valeur);
			}
			$nombre_de_ligne = $this->nombre_ligne;
			$i=0;
			$tab_texte_temp = $tab_texte;
			while ($nombre_de_ligne > 0)
			{
				$tab_comptage_mot = $this->retourne_longueur_mot_dans_tableau($tab_texte_temp);
				if (array_sum($tab_comptage_mot) > $this->nombre_caractere)
				{					
					array_pop ($tab_texte_temp);				
				}
				else
				{
					$numero_clef = count($tab_comptage_mot)-1;
					$tab_temp = array_slice ($tab_texte,0,$numero_clef);
					$texte_retour = implode (" ",$tab_temp);
					array_push($tab_sortie,$texte_retour);
					$tab_texte = array_slice ($tab_texte,$numero_clef);
					$nombre_de_ligne--;
					$tab_texte_temp = $tab_texte;
				}
			}
			return $tab_sortie;
		}
		
	}
	
	function retourne_longueur_mot_dans_tableau ($tableau = 'NULL')
	{
		if (empty($tableau))
			return FALSE;
			
		foreach ($tableau as $cle => $valeur)
		{
			$tab_sortie[$cle] = strlen($valeur);
		}
		return $tab_sortie;
	}
	
	
}
?>
Note : je l'ai mis dans contributions sans savoir si quelqu'un l'avait faites avant moi.

Re: tronquer un texte

par AB » 11 janv. 2010, 05:21

Limiter à un nombre de caractères me conviendrait...
Oui mais en faisant juste comme ça tu risque de couper un mot ce qui n'est pas bien joli.
A ta place je suivrais les conseils de Ryle pour la suite.
Ou alors plus trivialement je rechercherais le dernier espace, ce qui est moins perfectionné mais plus simple à coder et quand même plus propre que de couper un mot.
$texte = substr($texte,0,400);
$texte = substr($texte, 0, strrpos($texte, ' ')).' ...';

Re: tronquer un texte

par djtec » 11 janv. 2010, 00:27

Il te suffit de faire:
$cellule .= substr($row['texte'], 0, 400);

Re: tronquer un texte

par cmoi » 10 janv. 2010, 23:38

Limiter à un nombre de caractères me conviendrait. Le code serait quelque chose comme ça ?
.substr("texte",0,400).
Par contre, comment l'intégrer dans mon code ?
à ce niveau, je suppose
$cellule .= $row['texte']; 
comment lier les 2 morceaux ?