8795 sujets

Développement web côté serveur, CMS

Bonjour, J'ai un problème d'encodage sur un site que je suis en train de tester en ligne.
Ça concerne une vignette résumé d'actualité qui par des (...lire la suite) envoi vers une page d'actualités. Ce fichier actualité est administrable, le client peu donc ajouter des articles tant qu'il le souhaite via un wysiwyg. Aucun problème dans le fichier actualité, la mise en page et les caractères du wysiwyg sont bien reconnu.
Le problème est dans la vignette sur la page d'accueil:
Voici le code de la vignette:
<?php
include ("connect.php");
$sql= "SELECT * from article ORDER BY id DESC ";
$result= mysql_query($sql);
while ($Row = mysql_fetch_array($result)){ 
//$texte=mysql_real_escape_string($Row['texte']);
echo "<p>". substr(strip_tags($Row['texte']),0,80)." ... <a href='actualite.php#ancre".$Row['id']."'>lire la suite </a></p>";
}
?>

80 caractères par actualité sont donc affichées.
Si un mot avec accent tombe sur la limite des 80 caractères et qu'il n'est pas terminé, l'accent de celui-ci n'est pas reconnu et affiche un &eacute;
Je voudrais essayer d'afficher le contenu de cette vignette avec le nombre de mots à afficher, plus que le nombre caractère, pour que les mots ne soient pas coupé et donc évite ce problème.
Je ne sais pas comment m'y prendre avezvous une idée ?
Où une autre méthode ?
Merci
Luc
Modifié par lulldelull (02 Jul 2009 - 11:57)
Hello,

Commence déjà par mettre ton code dans les balises prévues pour, [ code] et [ /code] sans espaces.

Pour ton problème, tu devrais tenter de chercher le 80e caractère espace dans ton string, tu récupères l'emplacement de ce caractère et tu enlèves tout ce qui s'y trouve après.
C'est peut-être aussi faisable en expression régulière mais là je ne peux pas trop t'aider.

Toutes les fonctions qui te serviront se trouvent ici : http://www.w3schools.com/PHP/php_ref_string.asp
Modifié par Skoua (02 Jul 2009 - 11:42)
Je découvre ce forum et les habitudes à prendre aussi Smiley langue

Je ne vois pas comment m'y prendre, malgré tes conseils.
J'aurais besoin d'une réponse plus détaillée.
Je suis débutant en php.
Merci
Ce que tu peux faire c'est voir si des fonction comme utf8_encode/decode règle le problème (cf fr.php.net)

Si tu veux avoir des mots non tronqués tu peux essayer ça :


$mots = split($Row['texte'], " ");
$txt = "";
for($i = 0, $j = 0; $i < sizeof($mots); $i++) {
  $j += strlen(trim($mots[$i]));
  txt .= $mots[$i]." ";
  if($j >= 80) { break; } // Tu peux mettres cette ligne avant d'ajouter le mot à txt si tu ne veux pas dépasser les 80 caractères
}
echo "<p>".$txt." ... <a href='actualite.php#ancre".$Row['id']."'>lire la suite </a></p>";


- On coupe la chaîne initiale lorsque il y a un espace, on aura un tableau de mots.
- En parcourant ce tableau, on prend le nombre de caractères dans un mots, on l'additionne à ceux des mots précédents.
- On ajoute le mot dans le texte final.
- On sort de la boucle si le nombre de caractères des mots précédents est supérieur à 80
Merci.
ça donnerai ça:
<?php
include ("connect.php");

$sql= "SELECT * from article ORDER BY id DESC ";

  $mots = split($Row['texte'], " ");

$txt = "";

for($i = 0, $j = 0; $i < sizeof($mots); $i++) {

  $j += strlen(trim($mots[$i]));

  txt .= $mots[$i]."";

  if($j >= 80) { break; } // Tu peux mettres cette ligne avant d'ajouter le mot à txt si tu ne veux pas dépasser les 80 caractères

}

echo "<p>".$txt." ... <a href='actualite.php#ancre".$Row['id']."'>lire la suite </a></p>";

?>

Je ne suis vraiment pas un as du php Smiley confus . mais si c'est ça, je l'ai essayé et il y a une parse error:
Parse error: syntax error, unexpected T_CONCAT_EQUAL in /homez.193/.../www/actu-resum.php on line 14

Modifié par lulldelull (03 Jul 2009 - 09:15)
lulldelull a écrit :
Merci.

Je ne suis vraiment pas un as du php Smiley confus . mais si c'est ça, je l'ai essayé et il y a une parse error.


Pas de souci.

Oui, my bad, j'ai oublié un '$' à txt et me suis trompé de sens pour la fonction split(). Après modifs ça donne :

$mots = split(' ', $Row['texte']);
$txt = "";
for($i = 0, $j = 0; $i < sizeof($mots); $i++) {
  $j += strlen(trim($mots[$i]));
  $txt .= $mots[$i]." ";
  if($j >= 80) { break; } // Tu peux mettres cette ligne avant d'ajouter le mot à txt si tu ne veux pas dépasser les 80 caractères
}
echo "<p>".$txt." ... <a href='actualite.php#ancre".$Row['id']."'>lire la suite </a></p>";

Modifié par kurt11 (03 Jul 2009 - 14:13)
Merci beaucoup,
Finalement j'ai résolu mon problème avec la fonction couper texte conseillé par un copain:

function couperTexte($texte, $nbcar){
        $res="";
        $cut = explode(" ", $texte);

        for($i=0; $i<count($cut); $i++)
                if(strlen($res) + strlen($cut[$i]) + 1 <= $nbcar) $res .= $cut[$i] . " ";
        else return $res;

        return $res;
}

Si ça peut t'intéresser.
Merci encore !