Page 1 sur 1

Probleme de calcul de nombre de mot dans une variable Php

Posté : 26 févr. 2008, 14:30
par patouille
Bonjour à tous et toutes,

Je travaille sur un site ou des étudiants peuvent poster des articles afin de recevoir un certains nombres de points en fonction du nombre de mot et de faute d'orthographe que contient leurs articles.

Tout semble fonctionner a merveille et pourtant je suis face un problème de taille, effectivement lorsque je veux calculer le nombre de mot que contient un article il prend compte des balises Html malgré l'utilisation de "strip_tags".

Enfin il ne prend pas compte de toute les balises html, juste celle correspondant a un caractère bien précis ( Par exemple au lieu de m'afficher le caractère ', il m'affiche sa correspondance html &blabla; ).

Si vous avez une solution pour ne pas tenir compte de ses correspondances html.

Bien a vous.

Mon code :

$texte = html_entity_decode($donnees['texte']);
$texte=strip_tags($texte,""); -> Pour ne pas tenir compte des balises html
$texte=ereg_replace("[^a-zA-Z]"," ",$texte); -> Pour ne tenir compte que des lettres.

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 26 févr. 2008, 14:52
par Ryle
Utilise le strip_tags() avant le html_entity_decode() :)

Lorsque tu transforme les caractères spéciaux de la chaine en entités html, les crochets des balises sont également encodés (< et >) du coup le strip_tags() ne les considère pas comme des balises et ne peut les supprimer :)

Posté : 26 févr. 2008, 15:19
par h0_noMan
Utilise le strip_tags() avant le html_entity_decode() :)

Lorsque tu transforme les caractères spéciaux de la chaine en entités html, les crochets des balises sont également encodés (< et >) du coup le strip_tags() ne les considère pas comme des balises et ne peut les supprimer :)
Je suis d'accord pour mettre le strip_tags() avant le html_entity_decode().

Mais html_entity_decode() ne transforme les caractères spéciaux de la chaine en entités html, il fait plutot le contraire.

Il faut mettre le strip_tag() avant dans le cas ou dans l'article il y ait des balises mal fermés[/code]

Posté : 26 févr. 2008, 15:35
par patouille
En fait je n'ai strictement aucune raison d'utiliser html_entity_decode()

Mais si j'utilise simplement strip_tags(), plus aucune balise html n'est supprimées ( Alors la je ne comprend pas pourquoi ), voila pourquoi j'utilisais html_entity_decode() avant.

Je viens de tester en mettant tout la chaine de ma base de donnée dans un simple champs texte et de faire un strip_tags() sur celui ci et dans ce cas ça marche, mais dés que je récupère le champs de ma base de donnée, ça ne marche plus.

Comprend pas trop

Posté : 26 févr. 2008, 15:40
par h0_noMan
Quels sont les opérations que tu fais sur tes chaines de caractères avant de les stocker dans ta BDD ?

Donnes nous un exemple de ce qui est stocker.

Posté : 26 févr. 2008, 15:45
par patouille
La chaine de caractère est stockée dans la base de donnée au moment ou l'utilisateur enregistre son article, l'utilisateur utilise donc un éditeur de texte et les balises html pour écrire son texte.

J'aimerais pouvoir calculer le nombre de mots dans cette chaine ( Afin d'éviter comme je le faisais a présent de les calculer manuellement ) sans tenir compte des balises html ainsi que des caractères de ponctuation.

Un exemple de champs texte repris dans la base de donnée :
<p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"><font size="3"><font style="BACKGROUND-COLOR: #c0c0c0"><u><span lang="FR" style="FONT-SIZE: 12.5pt; COLOR: black; LINE-HEIGHT: 115%; FONT-FAMILY: "Arial","sans-serif"; mso-ansi-language: FR">Qu&rsquo;est ce que le HTML
Etc...

Et le problème vient de &rsquo;

Posté : 26 févr. 2008, 16:03
par h0_noMan
Le probleme viens du fait que html_entity_decode() ne convertit pas &rsquo; (et d'autres aussi)

Posté : 26 févr. 2008, 16:05
par patouille
Merci de la confirmation, je m'en doutais un peu.
Existe t'il une autre solution qui pourrait satisfaire mon besoin ???

Posté : 26 févr. 2008, 16:05
par Ryle
Mais html_entity_decode() ne transforme les caractères spéciaux de la chaine en entités html, il fait plutot le contraire.
Oops.. au temps pour moi... je ne sais pourquoi, même en le retapant, j'étais persuadé qu'il s'agissait d'un htmlentities() :oops:

Et euh... donc ? si tu strip tags avant et que tu html decode après, ca donne quoi ? ajoute des echo de la chaine à chaque étape, tu pourras plus facilement voir ce que fait php :)

Posté : 26 févr. 2008, 16:09
par patouille
Et euh... donc ? si tu strip tags avant et que tu html decode après, ca donne quoi ? ajoute des echo de la chaine à chaque étape, tu pourras plus facilement voir ce que fait php Smile
Comme je l'ai déjà dis plus haut çà ne change rien au problème, le résultat est toujours le même

Posté : 26 févr. 2008, 16:13
par h0_noMan
ajoute des echo de la chaine à chaque étape, tu pourras plus facilement voir ce que fait php :)
C'est la meilleure chose à faire.

Dans tout les problèmes la première étape est : ISOLER l'erreur/la panne

Et ça marche pour tout : électricité, plomberie, ...

Posté : 26 févr. 2008, 16:33
par patouille
En fait le souci vient de ceci :
ereg_replace("[^a-zA-Z]"," ",$text);

Ce qui est logique étant donné que je remplace tout ce qui n'est pas du caractère par un espace ( afin d'éviter les chiffres et les caractères de ponctuation ) mais je n'avais pas pensé que ça remplacerait aussi les & et ; des balise : &rsquo; et les autres.

Je n'ai pas vraiment le choix, je vais devoir autoriser les & et ; comme caractère quitte a le prendre comme un mot.

Posté : 26 févr. 2008, 17:42
par Ryle
Euh.... en théorie, tu ne devrait plus avoir de &rsquo; après le html_entity_decode()... donc je maintiens, prend la chaine que tu nous as donné en exemple, colle là dans une variable, affiche là, puis affiche un strip_tags() de cette variable, puis un html_entity_decode() de sa nouvelle valeur et enfin un preg_replace() de ce qui reste :)

Ps : et pour le strip_tags(), le second argument est facultatif, si tu n'as pas de valeur à lui donner, ne lui en donne pas ;)
texte=strip_tags($texte);

Posté : 26 févr. 2008, 17:44
par h0_noMan
Ou tu te crée une fonction remplaces les entités html non décodé par html_entity_decode()