"ce petit contrat a été signé, tout a coup, ce con, que dis-je, ce conard, eu un air condescendant à ma grande déconvenue !"
cs_armenak
Messages postés58Date d'inscriptionvendredi 29 août 2003StatutMembreDernière intervention25 octobre 2010 7 déc. 2007 à 11:47
Petit problème avec preg_match. Dans le manuel dit ça :
"\b, dans le masque, indique une limite de mot,"
J'ai donc, bon élève, codé comme ça pour ne récupérer $mot qu'en tant que mot et non en tant que partie éventuelle de mot:
preg_match("/\b$mot\b/i",$texte))
Et bien, ça ne fonctionne absolument pas, j'y ai gagné encore une centaine de cheveux blancs (regardez les heures dans l'historique!).
Par contre, en utilisant la syntaxe que j'avais prévue à l'origine pour la fonction ereg avnnt d'avoir été soumis à la lapidation par tout CS, c'est accepté par le serveur et donne le résultat escompté
if (preg_match("/^$mot$/i",$texte))
Allez m'expliquer ça...
audayls
Messages postés373Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention11 août 2008 5 déc. 2007 à 22:51
Je ne connaissais pas le filtre de Bayes mais c'est une lacune que je vais vite combler car d'après ce que j'en ai vu çà m'a l'air interessant ! Merci coucou747 ^^
Sinon pour un filtre de la sorte une utilisation de phonex pourrait être pratique non ? Mais bon je pense que le serveur ne va pas apprécier XD
Au fait placer "preg_match("/http/i", $texte)" dans la boucle c'est totalement inutile.
cs_armenak
Messages postés58Date d'inscriptionvendredi 29 août 2003StatutMembreDernière intervention25 octobre 2010 5 déc. 2007 à 09:08
MALALAM, j'ai eu hier soir une attaque de spam, et le filtre à gros mots n'y a rien fait puisqu'aucun des mots utilisés, des mots simples et courants, n'était dans la liste. Cependant la majorité de ces mots étaient des liens, aussi j'ai ajouté un preg_match comme tu me le conseilles, mais ciblé sur la chaine "http", ce qui m'évitera tous les liens.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 4 déc. 2007 à 22:27
preg_match ne change rien à la redirection, je ne pige pas ton problème là-dessus ? Preg_match() ne fera que te renvoyer si oui ou non, ton motif est trouvé; ceci dit j'insiste aussi : si on suit l'algo de ton code, strpos à est largement préférable à preg_match().
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 4 déc. 2007 à 13:36
ca marche parfaitement bien, mais il faut mettre strpos($texte, $mot) et pas strpos($mot,$texte)
cs_armenak
Messages postés58Date d'inscriptionvendredi 29 août 2003StatutMembreDernière intervention25 octobre 2010 4 déc. 2007 à 13:34
preg_match ne correspond pas à ce que je veux faire avec cette fonction, c'est à dire envoyer dans une voie de garage tous les poseurs de message avec des mots interdits. Par contre, j'ai réussi à placer strpos d'une manière fonctionnelle. Merci de votre acharnement.
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 4 déc. 2007 à 12:51
remplace la fonction ereg, car elle n'est pas performante (et deprecated :p)
Utilise preg_match si tu fait des expressions regulières, sinon strpos ();
la Location dans un header ca prend une URL absolue
cs_armenak
Messages postés58Date d'inscriptionvendredi 29 août 2003StatutMembreDernière intervention25 octobre 2010 3 déc. 2007 à 23:22
Merci kiki67100 , mais je dois avoir les neurones sclérosés,je ne comprends pas ce qu'il faut faire. Je suis allé en tout premier sur cette page, mais en ce qui concerne ce script, je ne vois pas comment utiliser strpos. Si j'ai bien compris, strpos donne la position de $mot dans $texte. Et si $mot n'existe pas dans $texte, il me retournera false. Alors si j'écris :
if (strpos($mot,$texte)===false) , c'est à dire, si j'ai bien compris, que $mot n'existe pas dans $texte, il me manque les connaissances de syntaxe pour ce que je dois écrire avant
else
{
header("Location:voiedegarage.php");
exit;
}
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 3 déc. 2007 à 23:01
"Tenter de trouver un algo qui censure côté serveur (donc en php par exemple), c'est juste suicidaire"-> les filtres de bayes des anti spams sont parfaitement adapte a ce genre de source... Les filtres de bayes font intervennir des notions de proba et statistique avancee... mais ca ne tue en rien le serveur... (pour bien faire faudrait coder ca en sql directement)
sinon un preg_replace de ce genre :
$texte=preg_replace('/(vilain|traitre|mechant|)/', '', $texte);
offre un filtrage de chaque mot mais pas du post en general
faudrait que j'ecrive un truc sur Bayes en SQL et si ca ne suffit pas, en C pour SQL ou php (chaud, mais utile)
cs_armenak
Messages postés58Date d'inscriptionvendredi 29 août 2003StatutMembreDernière intervention25 octobre 2010 3 déc. 2007 à 22:53
Mais quelle évolution depuis mon premier post! Merci à tous, même aux "méchants".
kiki67100
Messages postés313Date d'inscriptionsamedi 6 mai 2006StatutMembreDernière intervention10 août 20131 3 déc. 2007 à 22:52
cs_armenak
Messages postés58Date d'inscriptionvendredi 29 août 2003StatutMembreDernière intervention25 octobre 2010 3 déc. 2007 à 22:32
C'est pas trois commentaires ni un refus de mon code qui me dégouterait du php. C'est trop passionnant. Ceci dit je vous trouve bien sévères. Il y a quelques mois, j'aurais été le plus heureux de trouver un petit code tout fait comme celui-là.
Le but de cette fonction n'est que de comparer un texte avec une liste, et rien d'autre. Pas question de remplacer les mots. Imaginez url remplacé par mon chéri...
Amélioré en mettant tout en minuscules pour ne pas avoir de problème de casse (ça va se faire), je le trouve personnellement très utile, surtout avec une liste de mots qui peut s'agrandir à l'usage, un peu comme les logiciels anti-spam. C'est évident que la première fois qu'un mot non encore interdit sera utilisé, il apparaîtra. Quant à l'auto-censure, l'expérience qui est un des avantages de mon âge m'autorise à rire doucement, c'est à mon tour cette fois-ci!
Malalam, j'ai pas trouvé comment utiliser strpos dans ce cas, désolé...
guill76
Messages postés193Date d'inscriptionmercredi 24 août 2005StatutMembreDernière intervention 3 juin 2016 3 déc. 2007 à 21:10
Salut,
Ouais c'est vrai mais dans ce cas faut faire le parsing en c ou en cpp et pas en php, ou un mix des 2 avec une tache php qui te fait l'extract des post des utilisateurs de la journée, une tache c++ qui te parse tes fichiers et qui te balance un petit rapport puis purge tes fichiers extraits et une derniere en php qui te supprime les posts correspondants trouvés dans ce rapport.
kiki67100
Messages postés313Date d'inscriptionsamedi 6 mai 2006StatutMembreDernière intervention10 août 20131 3 déc. 2007 à 21:04
malalam > Oui je suis dacord .
l'idée de l'autocensure c'est pratique sur un gestion de blog je pense qu'une validation avant le mise en ligne du commentaire serais bien on pourais l'autocensure par des ****
armenak > pour le code j'aurais fait un explode("\n",$file); dans ton fichier ca serais ainsi
fichier.txt:
1ème gros mot
2ème
3ème
ect...
sa serais plus simple de rajouté des gros mot a chaque fois :)
Voilà ++
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 3 déc. 2007 à 20:19
Hello,
je suis très embêté...sincèrement, je ne devrais pas laisser cette source, je devrais la supprimer. Mais, Armenak, tu sembles sympathique, et avoir quelqu'un de ton âge (sans vouloir enfoncer, hein ;-) ) qui se met au php, ça ne donne pas envie de tuer sa nouvelle vocation dans l'oeuf.
Bref...je parlerai des solutions au problème que tu tentes de résoudre ici un peu plus bas. Tout d'abord, le code :
un foreach($tab as $mot)serait aussi efficace et prendrait moins de lignes que ton while() (et tu économiserais un count()).
ereg() est mauvais en terme de performances, SURTOUT utilisé comme ça. Si tu tiens à utiliser une expression régulière, utilise preg_match(), mais encore faut-il utiliser une expression régulière! Là, tu ne fais que vérifier si un mot est présent dans une chaîne. A ce compte la, strpos() est largement plus adapté. Mais là en l'occurence, ce n'est pas ce qu'il faut faire en effet. Ton code va interdire des mots qui ne devraient pas l'être.
Maintenant, le sujet du code. C'est une problématique importante...elle l'est de plus en plus d'ailleurs (Internet, soyons honnête, devient vraiment une décharge...les jeunes ne savent plus ni écrire, ni se comporter correctement); je pense que de l'eau va couleur sous les ponts avant que l'on trouve une solution plus efficace que la censure manuelle (voyez CS). Tenter de trouver un algo qui censure côté serveur (donc en php par exemple), c'est juste suicidaire (ou plutôt un meurtre: celui de votre serveur web). Impliquer en plus son serveur DB, cela devient du masochisme (ou du sadisme, donc, tout dépend de qul côté on se place).
Après tout, le fautif se trouve côté client. Donc je pense qu'une telle vérification devrait se faire côté client, dans l'absolu...sauf que, évidemment, côté client...c'est contournable par un esprit malintentionné -ce sera le cas à tous les coups- et un tant soit peu doué -ça heureusement, c'est beaucoup plus rare.
Du coup, on fait quoi ? Bah à mon avis, le meilleur moyen est de parvenir à instaurer une atmosphère et un système favorisant l'auto-censure. Nous sommes à l'ère du web 2.0, pour reprendre un terme à la mode. Il y a des tonnes de sites, de plus en plus, qui fonctionnent grâce aux utilisateurs; le contenu, ce sont eux, les utilisateurs. ET beaucoup de sites s'en tirent fort bien...pourquoi ? Parce ces sites ont réussi à faire en sorte que les utilisateurs aient intérêt à bien se comporter : ils seront populaires et aimés si tel est le cas...
C'est con, mais ça marche, et c'est vers cela que l'on tend. L'autocensure.
Ces petites considérations mises à part : si on veut vraiment coder une censure...je pense, moi, que je procèderais différemment. Ce sera un algo gourmand de toute manière. Alors si vraiment j'avais le besoin de censurer des données utilisateurs, et pas le temps/les ressources nécessaires, pour faire une censure manuelle, voilà ce que je ferais : puisque je ne fais pas confiance dans les saisies de mes uitilisateurs, je ne les mettrais pas en ligen de suite, ce serait du différé? à J+1 par exemple. Le soir, une tâche CRON tournerait et irait vérifier tous les messages en attente de validation, et les censurerait (là...un dico sans doute, en base vu que ça ne se ferait qu'une fois par nuit, et avec force d'expressions régulières), puis les validerait pour mise en ligne.
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 3 déc. 2007 à 16:59
Je noterai aussi à ce moment là :)
Bon courage
kiki67100
Messages postés313Date d'inscriptionsamedi 6 mai 2006StatutMembreDernière intervention10 août 20131 3 déc. 2007 à 16:47
J'attent la mise a jour ! :)
je noterais a se moment là
++
cs_armenak
Messages postés58Date d'inscriptionvendredi 29 août 2003StatutMembreDernière intervention25 octobre 2010 3 déc. 2007 à 16:43
Merci
Le "vous me tuez" n'était qu'une manière de rire de moi. J'ai déjà commencé à travailler dans la direction indiquée, et je ne suis pas loin du but. Pas de problème si vous effacez tout ça. Effectivement, mes copains, de mon âge, ont bien rigolé, mais bon, certaines remarques ont été un peu raides. Et même si c'est la règle du jeu ici, effacez, oui!(j'ai sauvegardé la page).
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 3 déc. 2007 à 16:14
De toute facon il doit y avoir autant de possibilités que d'utilisateurs CS ;)
@Armenak, le but n'est pas de te "tuer" mais de te montrer tes points faibles. C'est pas forcément facile de se prendre des remarques du genre "ton code sert à rien, il est nul", etc. Je sais, je suis passé par là aussi :) Mais au final, si on accepte de comprendre nos erreurs, on progresse mieux, et on repart de plus belle.
Ce qui est dit n'est pas là pour te prouver que tu ne vaut rien et que tu ne peux pas faire partie du cercle très privé de cs (ce qui est totalement débile), le but, c'est de te montrer tes erreurs pour progresser.
Si on ne te dit que du bien, comment va tu évoluer ?
Maintenant que tu à vu ou sont tes erreurs, quelles sont les solutions pour optimiser ton code, refait le, améliore le, et repropose nous quelque chose de meilleur, vraiment meilleur. Peut-être déjà sur le forum, afin qu'il soit validé, et une fois que l'accord est trouvé, dans les codes.
Je ne veux pas te décevoir, mais je pense que ce code sera supprimé car il montre ce qu'il ne faut pas faire. Apres, je n'ai pas les droits de faire ca, on verra bien ce qu'en disent les admins.
Courage à toi et a bientot pour une amélioration ! :)
kiki67100
Messages postés313Date d'inscriptionsamedi 6 mai 2006StatutMembreDernière intervention10 août 20131 3 déc. 2007 à 15:48
Salut,
Il ya plusieur facon de faire moi j'avais penser à faire un fichier texte avec tout les mot interdit delimité par des retour a la ligne après tu fait un explode('\n',$contenuefichier); après tu fait un in_array
++
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 3 déc. 2007 à 15:41
Bien que de toute facon, je suppose que parser un texte pour y trouver des caractères interdit soit quelque chose de très lourd, tu a beaucoup de maniere différentes :
1) Tu fait un explode de ton texte avec des espace, ensuite tu récupere depuis une bdd (pourquoi pas) la liste des mots interdits, que tu met dans un tableau, ensuite tu joue avec les in_array
2) Même idée, mais avec la fonction preg_replace_callback.
Tu sépare par espace, tu fait appel à ta fonction qui contient un tableau (un appel ! un seul appel à la bdd) de mots interdits, s'il est trouvé : soit tu fait un break et tu refuse l'ajout, soi tu le remplace par rien (moyen)
3) Encore plus simple, un preg_replace, premier parametre, ton tableau contenant les mots interdits, deuxieme parametre ce qu'il faut mettre en échange (genre co***rd=>mon coeur), le troisieme parametre .... ton texte
Et hop ! Tu gagne un temps ENORME ! :)
kiki67100
Messages postés313Date d'inscriptionsamedi 6 mai 2006StatutMembreDernière intervention10 août 20131 3 déc. 2007 à 14:04
Salut,,
Erff le code , tu peux faire un
$i++; a la place de "$i = $i+1;" et tu te deconnecte jamais te ta bdd ?
mysql_close();
revoie ta source
++
webdeb
Messages postés488Date d'inscriptionsamedi 5 avril 2003StatutMembreDernière intervention31 mars 20094 3 déc. 2007 à 13:26
Nan pas ereg() mais preg_replace()
cs_armenak
Messages postés58Date d'inscriptionvendredi 29 août 2003StatutMembreDernière intervention25 octobre 2010 3 déc. 2007 à 13:24
ereg, j'y avait pensé, mais la phrase "j'habite à la Martinique" ne serait pas acceptée. Je vais plancher sur le fichier texte, merci encore.
cs_armenak
Messages postés58Date d'inscriptionvendredi 29 août 2003StatutMembreDernière intervention25 octobre 2010 3 déc. 2007 à 13:16
Vous m'avez tué, merci...
webdeb
Messages postés488Date d'inscriptionsamedi 5 avril 2003StatutMembreDernière intervention31 mars 20094 3 déc. 2007 à 13:02
Salut,
Je vais critiquer vivement ta source pour que tu te rends compte qu'elle n'est pas du tout adaptée... En effet, pour ce genre de choses, on n'utilise pas une base de données et encore moins ce que tu fais. C'est à dire d'aller taper dans la base de données pour chaque mot du texte. Imagine un texte de 2000 mots. Tu vas faire 2000 requêtes SQL pour 1 visiteur. Si tu as 100 visiteurs dans la journée, tu auras fait 2 000 * 100 = 200 000 requêtes SQL rien que pour gérer les insultes dans ton livre d'or. Niveau performance c'est loin d'être fameux... Surtout que tu ne retires pas les mots inutiles comme "de, le, les, ce, te, me, des...". Pour optimiser le tout, tu aurais pu faire des regroupements et générer un histogramme. C'est à dire un tableau associatif qui indique le nombre d'occurences pour chaque mot. Ce qui donne globalement :
En faisant une requête SQL sur chaque mot 1 fois tu aurais déjà grandement amélioré les performances. Mais j'insiste toujours sur le fait qu'une base de données reste inappropriée pour ce genre d'applications.
Une solution aurait été tout simplement d'utiliser une Expreg (voir: expreg.com) bien que ce soit aussi coûteux en temps de traitement. Les manipulations de chaines de caractères par expression régulière sont toujours un peu lourdes mais restent au final bien plus performantes que ta solution.
Dernière solution qui est sans aucun doute la meilleure : la modération. En effet, il vaut mieux rendre invisible un post dans un livre d'or et le valider manuellement s'il convient à la nétiquette du site.
Autres points à revoir dans ton code :
1/ Tu n'as pas besoin de faire un mysql_select_db() à chaque itération de la boucle while(). Tu l'as fait une bonne fois pour toute dans ta page.
2/ $tab["$i"] est à remplacer par $tab[$i]. Ce n'est pas la peine de compliquer le code davantage avec des guillemets inutiles. D'ailleurs, ce sera aussi plus coûteux en traitement.
3/ Tu ne testes pas si un gros mot existe dans ta base. Tu fais la requête mais tu ne récupères pas le résultat.
Au final, ton code n'a rien d'intéressant et de performant...
++
cs_depression
Messages postés100Date d'inscriptionmardi 7 novembre 2000StatutMembreDernière intervention13 juillet 2009 3 déc. 2007 à 12:49
Ca ne donne pas envie de rire mais plutôt de pleurer.
global $database_x
global $x
Tu peux passer ces variables à ta fonction en paramètre par référence.
$mot = $tab["$i"];
$i est un entier, c'est affreux ce que tu fais.
mysql_select_db($database_x, $x);
Ca, tu le mets hors de ta boucle.
Une requête dans la base à chaque mot, c'est crade!
Mets plutôt tes gros mots dans un fichier, et fais un file_get_contents
11 déc. 2007 à 02:55
Sinon tu peux faire un truc du genre en moin court
<?
$message="........";
$bannir = "mais|clé";
$chainereplace=preg_replace("/(^|[^a-zA-Z])($bannir)([^a-zA-Z]|$)/si",
'\\1'.$blurb.'\\3',$message);
?>
++ PS(je les trouver sur un site)
http://www.phpinfo.net/page/archives/astuces/php/expressions-regulieres/
10 déc. 2007 à 03:30
pour le code, j'aime beaucoup la fonction OterAccents :==)
8 déc. 2007 à 18:58
7 déc. 2007 à 15:41
Merci
7 déc. 2007 à 15:08
http://www.aliasdmc.fr/coursjavas/cours_javascript600.html
La propriété javascript ignoreCase de l'objet RegExp permet de connaître la valeur du modificateur i.
7 déc. 2007 à 14:53
(pardonnez mon ignorance...)
parce que dans mon outil http://www.vbfrance.com/codes/REGEXP-WORKSHOP_17331.aspx,
\bcon\b
fonctionne bien...
"ce petit contrat a été signé, tout a coup, ce con, que dis-je, ce conard, eu un air condescendant à ma grande déconvenue !"
7 déc. 2007 à 11:47
"\b, dans le masque, indique une limite de mot,"
J'ai donc, bon élève, codé comme ça pour ne récupérer $mot qu'en tant que mot et non en tant que partie éventuelle de mot:
preg_match("/\b$mot\b/i",$texte))
Et bien, ça ne fonctionne absolument pas, j'y ai gagné encore une centaine de cheveux blancs (regardez les heures dans l'historique!).
Par contre, en utilisant la syntaxe que j'avais prévue à l'origine pour la fonction ereg avnnt d'avoir été soumis à la lapidation par tout CS, c'est accepté par le serveur et donne le résultat escompté
if (preg_match("/^$mot$/i",$texte))
Allez m'expliquer ça...
5 déc. 2007 à 22:51
Sinon pour un filtre de la sorte une utilisation de phonex pourrait être pratique non ? Mais bon je pense que le serveur ne va pas apprécier XD
Au fait placer "preg_match("/http/i", $texte)" dans la boucle c'est totalement inutile.
5 déc. 2007 à 09:08
4 déc. 2007 à 22:27
4 déc. 2007 à 13:36
OK
max@debian:~$ php -r "if (strpos('test', 'u')!==false)echo 'OK'."\\n";"
max@debian:~$
ca marche parfaitement bien, mais il faut mettre strpos($texte, $mot) et pas strpos($mot,$texte)
4 déc. 2007 à 13:34
4 déc. 2007 à 12:51
Utilise preg_match si tu fait des expressions regulières, sinon strpos ();
quand tu veux une fonction en php, tu va dans ton navigateur et tu tape :
http://php.net/nomFonction
http://php.net/strpos
4 déc. 2007 à 11:21
6.54, c'est de la passion, ça! Respect.
4 déc. 2007 à 06:54
header('Location: http://monsite/mondir/voiedegarage.php');
exit;
}
la Location dans un header ca prend une URL absolue
3 déc. 2007 à 23:22
if (strpos($mot,$texte)===false) , c'est à dire, si j'ai bien compris, que $mot n'existe pas dans $texte, il me manque les connaissances de syntaxe pour ce que je dois écrire avant
else
{
header("Location:voiedegarage.php");
exit;
}
3 déc. 2007 à 23:01
sinon un preg_replace de ce genre :
$texte=preg_replace('/(vilain|traitre|mechant|)/', '', $texte);
offre un filtrage de chaque mot mais pas du post en general
faudrait que j'ecrive un truc sur Bayes en SQL et si ca ne suffit pas, en C pour SQL ou php (chaud, mais utile)
3 déc. 2007 à 22:53
3 déc. 2007 à 22:52
3 déc. 2007 à 22:32
Le but de cette fonction n'est que de comparer un texte avec une liste, et rien d'autre. Pas question de remplacer les mots. Imaginez url remplacé par mon chéri...
Amélioré en mettant tout en minuscules pour ne pas avoir de problème de casse (ça va se faire), je le trouve personnellement très utile, surtout avec une liste de mots qui peut s'agrandir à l'usage, un peu comme les logiciels anti-spam. C'est évident que la première fois qu'un mot non encore interdit sera utilisé, il apparaîtra. Quant à l'auto-censure, l'expérience qui est un des avantages de mon âge m'autorise à rire doucement, c'est à mon tour cette fois-ci!
Malalam, j'ai pas trouvé comment utiliser strpos dans ce cas, désolé...
3 déc. 2007 à 21:10
Ouais c'est vrai mais dans ce cas faut faire le parsing en c ou en cpp et pas en php, ou un mix des 2 avec une tache php qui te fait l'extract des post des utilisateurs de la journée, une tache c++ qui te parse tes fichiers et qui te balance un petit rapport puis purge tes fichiers extraits et une derniere en php qui te supprime les posts correspondants trouvés dans ce rapport.
3 déc. 2007 à 21:04
l'idée de l'autocensure c'est pratique sur un gestion de blog je pense qu'une validation avant le mise en ligne du commentaire serais bien on pourais l'autocensure par des ****
armenak > pour le code j'aurais fait un explode("\n",$file); dans ton fichier ca serais ainsi
fichier.txt:
1ème gros mot
2ème
3ème
ect...
sa serais plus simple de rajouté des gros mot a chaque fois :)
Voilà ++
3 déc. 2007 à 20:19
je suis très embêté...sincèrement, je ne devrais pas laisser cette source, je devrais la supprimer. Mais, Armenak, tu sembles sympathique, et avoir quelqu'un de ton âge (sans vouloir enfoncer, hein ;-) ) qui se met au php, ça ne donne pas envie de tuer sa nouvelle vocation dans l'oeuf.
Bref...je parlerai des solutions au problème que tu tentes de résoudre ici un peu plus bas. Tout d'abord, le code :
un foreach($tab as $mot)serait aussi efficace et prendrait moins de lignes que ton while() (et tu économiserais un count()).
ereg() est mauvais en terme de performances, SURTOUT utilisé comme ça. Si tu tiens à utiliser une expression régulière, utilise preg_match(), mais encore faut-il utiliser une expression régulière! Là, tu ne fais que vérifier si un mot est présent dans une chaîne. A ce compte la, strpos() est largement plus adapté. Mais là en l'occurence, ce n'est pas ce qu'il faut faire en effet. Ton code va interdire des mots qui ne devraient pas l'être.
Maintenant, le sujet du code. C'est une problématique importante...elle l'est de plus en plus d'ailleurs (Internet, soyons honnête, devient vraiment une décharge...les jeunes ne savent plus ni écrire, ni se comporter correctement); je pense que de l'eau va couleur sous les ponts avant que l'on trouve une solution plus efficace que la censure manuelle (voyez CS). Tenter de trouver un algo qui censure côté serveur (donc en php par exemple), c'est juste suicidaire (ou plutôt un meurtre: celui de votre serveur web). Impliquer en plus son serveur DB, cela devient du masochisme (ou du sadisme, donc, tout dépend de qul côté on se place).
Après tout, le fautif se trouve côté client. Donc je pense qu'une telle vérification devrait se faire côté client, dans l'absolu...sauf que, évidemment, côté client...c'est contournable par un esprit malintentionné -ce sera le cas à tous les coups- et un tant soit peu doué -ça heureusement, c'est beaucoup plus rare.
Du coup, on fait quoi ? Bah à mon avis, le meilleur moyen est de parvenir à instaurer une atmosphère et un système favorisant l'auto-censure. Nous sommes à l'ère du web 2.0, pour reprendre un terme à la mode. Il y a des tonnes de sites, de plus en plus, qui fonctionnent grâce aux utilisateurs; le contenu, ce sont eux, les utilisateurs. ET beaucoup de sites s'en tirent fort bien...pourquoi ? Parce ces sites ont réussi à faire en sorte que les utilisateurs aient intérêt à bien se comporter : ils seront populaires et aimés si tel est le cas...
C'est con, mais ça marche, et c'est vers cela que l'on tend. L'autocensure.
Ces petites considérations mises à part : si on veut vraiment coder une censure...je pense, moi, que je procèderais différemment. Ce sera un algo gourmand de toute manière. Alors si vraiment j'avais le besoin de censurer des données utilisateurs, et pas le temps/les ressources nécessaires, pour faire une censure manuelle, voilà ce que je ferais : puisque je ne fais pas confiance dans les saisies de mes uitilisateurs, je ne les mettrais pas en ligen de suite, ce serait du différé? à J+1 par exemple. Le soir, une tâche CRON tournerait et irait vérifier tous les messages en attente de validation, et les censurerait (là...un dico sans doute, en base vu que ça ne se ferait qu'une fois par nuit, et avec force d'expressions régulières), puis les validerait pour mise en ligne.
3 déc. 2007 à 16:59
Bon courage
3 déc. 2007 à 16:47
je noterais a se moment là
++
3 déc. 2007 à 16:43
Le "vous me tuez" n'était qu'une manière de rire de moi. J'ai déjà commencé à travailler dans la direction indiquée, et je ne suis pas loin du but. Pas de problème si vous effacez tout ça. Effectivement, mes copains, de mon âge, ont bien rigolé, mais bon, certaines remarques ont été un peu raides. Et même si c'est la règle du jeu ici, effacez, oui!(j'ai sauvegardé la page).
3 déc. 2007 à 16:14
@Armenak, le but n'est pas de te "tuer" mais de te montrer tes points faibles. C'est pas forcément facile de se prendre des remarques du genre "ton code sert à rien, il est nul", etc. Je sais, je suis passé par là aussi :) Mais au final, si on accepte de comprendre nos erreurs, on progresse mieux, et on repart de plus belle.
Ce qui est dit n'est pas là pour te prouver que tu ne vaut rien et que tu ne peux pas faire partie du cercle très privé de cs (ce qui est totalement débile), le but, c'est de te montrer tes erreurs pour progresser.
Si on ne te dit que du bien, comment va tu évoluer ?
Maintenant que tu à vu ou sont tes erreurs, quelles sont les solutions pour optimiser ton code, refait le, améliore le, et repropose nous quelque chose de meilleur, vraiment meilleur. Peut-être déjà sur le forum, afin qu'il soit validé, et une fois que l'accord est trouvé, dans les codes.
Je ne veux pas te décevoir, mais je pense que ce code sera supprimé car il montre ce qu'il ne faut pas faire. Apres, je n'ai pas les droits de faire ca, on verra bien ce qu'en disent les admins.
Courage à toi et a bientot pour une amélioration ! :)
3 déc. 2007 à 15:48
Il ya plusieur facon de faire moi j'avais penser à faire un fichier texte avec tout les mot interdit delimité par des retour a la ligne après tu fait un explode('\n',$contenuefichier); après tu fait un in_array
++
3 déc. 2007 à 15:41
1) Tu fait un explode de ton texte avec des espace, ensuite tu récupere depuis une bdd (pourquoi pas) la liste des mots interdits, que tu met dans un tableau, ensuite tu joue avec les in_array
2) Même idée, mais avec la fonction preg_replace_callback.
Tu sépare par espace, tu fait appel à ta fonction qui contient un tableau (un appel ! un seul appel à la bdd) de mots interdits, s'il est trouvé : soit tu fait un break et tu refuse l'ajout, soi tu le remplace par rien (moyen)
3) Encore plus simple, un preg_replace, premier parametre, ton tableau contenant les mots interdits, deuxieme parametre ce qu'il faut mettre en échange (genre co***rd=>mon coeur), le troisieme parametre .... ton texte
Et hop ! Tu gagne un temps ENORME ! :)
3 déc. 2007 à 14:04
Erff le code , tu peux faire un
$i++; a la place de "$i = $i+1;" et tu te deconnecte jamais te ta bdd ?
mysql_close();
revoie ta source
++
3 déc. 2007 à 13:26
3 déc. 2007 à 13:24
3 déc. 2007 à 13:16
3 déc. 2007 à 13:02
Je vais critiquer vivement ta source pour que tu te rends compte qu'elle n'est pas du tout adaptée... En effet, pour ce genre de choses, on n'utilise pas une base de données et encore moins ce que tu fais. C'est à dire d'aller taper dans la base de données pour chaque mot du texte. Imagine un texte de 2000 mots. Tu vas faire 2000 requêtes SQL pour 1 visiteur. Si tu as 100 visiteurs dans la journée, tu auras fait 2 000 * 100 = 200 000 requêtes SQL rien que pour gérer les insultes dans ton livre d'or. Niveau performance c'est loin d'être fameux... Surtout que tu ne retires pas les mots inutiles comme "de, le, les, ce, te, me, des...". Pour optimiser le tout, tu aurais pu faire des regroupements et générer un histogramme. C'est à dire un tableau associatif qui indique le nombre d'occurences pour chaque mot. Ce qui donne globalement :
$tabMots = array('mechant'=>3, 'con'=>8, 'merde'=>3, 'bonjour'=>1);
En faisant une requête SQL sur chaque mot 1 fois tu aurais déjà grandement amélioré les performances. Mais j'insiste toujours sur le fait qu'une base de données reste inappropriée pour ce genre d'applications.
Une solution aurait été tout simplement d'utiliser une Expreg (voir: expreg.com) bien que ce soit aussi coûteux en temps de traitement. Les manipulations de chaines de caractères par expression régulière sont toujours un peu lourdes mais restent au final bien plus performantes que ta solution.
Dernière solution qui est sans aucun doute la meilleure : la modération. En effet, il vaut mieux rendre invisible un post dans un livre d'or et le valider manuellement s'il convient à la nétiquette du site.
Autres points à revoir dans ton code :
1/ Tu n'as pas besoin de faire un mysql_select_db() à chaque itération de la boucle while(). Tu l'as fait une bonne fois pour toute dans ta page.
2/ $tab["$i"] est à remplacer par $tab[$i]. Ce n'est pas la peine de compliquer le code davantage avec des guillemets inutiles. D'ailleurs, ce sera aussi plus coûteux en traitement.
3/ Tu ne testes pas si un gros mot existe dans ta base. Tu fais la requête mais tu ne récupères pas le résultat.
Au final, ton code n'a rien d'intéressant et de performant...
++
3 déc. 2007 à 12:49
global $database_x
global $x
Tu peux passer ces variables à ta fonction en paramètre par référence.
$mot = $tab["$i"];
$i est un entier, c'est affreux ce que tu fais.
mysql_select_db($database_x, $x);
Ca, tu le mets hors de ta boucle.
Une requête dans la base à chaque mot, c'est crade!
Mets plutôt tes gros mots dans un fichier, et fais un file_get_contents
Ensuite, Il y a strpos()