FILTRE À GROS MOTS POUR LIVRE D'OR

cs_depression Messages postés 100 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 13 juillet 2009 - 3 déc. 2007 à 12:49
kiki67100 Messages postés 313 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 10 août 2013 - 11 déc. 2007 à 02:55
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44901-filtre-a-gros-mots-pour-livre-d-or

kiki67100 Messages postés 313 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 10 août 2013 1
11 déc. 2007 à 02:55
Salut ,
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/
LaurentKOogar Messages postés 369 Date d'inscription samedi 4 septembre 2004 Statut Membre Dernière intervention 20 octobre 2013
10 déc. 2007 à 03:30
enfin, j'ai reussi a me connecter, apres 5 minutes j'ai fini par comprendre que la connection sur phpcs bug sous IE6, alors j'ai pris mon FoFox ;)

pour le code, j'aime beaucoup la fonction OterAccents :==)
cs_armenak Messages postés 58 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 25 octobre 2010
8 déc. 2007 à 18:58
La fonction pour supprimer les accents d'Arnotic se trouve ici : http://www.phpcs.com/codes/SUPPRIMER-ACCENTS_12788.aspx
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 déc. 2007 à 15:41
je pensait bien à un IgnoreCase.... mais j'etais pas sur de mon coup.

Merci
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
7 déc. 2007 à 15:08
http://www.google.fr/search?hl=fr&q=regexp+modificateurs
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.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 déc. 2007 à 14:53
qu'est censé faire le /i ?
(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 !"
cs_armenak Messages postés 58 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 25 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és 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 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és 58 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 25 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és 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
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és 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
4 déc. 2007 à 13:36
max@debian:~$ php -r "if (strpos('test', 't')!==false)echo 'OK'."\\n";"
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)
cs_armenak Messages postés 58 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 25 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és 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
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 ();

quand tu veux une fonction en php, tu va dans ton navigateur et tu tape :
http://php.net/nomFonction

http://php.net/strpos
cs_armenak Messages postés 58 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 25 octobre 2010
4 déc. 2007 à 11:21
J'ai ajouté la correction pour le header, bien que cela fonctionne aussi sans. Par contre, la correction !==false ne fonctionne pas...

6.54, c'est de la passion, ça! Respect.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
4 déc. 2007 à 06:54
if (strpos($mot,$texte)!==false){
header('Location: http://monsite/mondir/voiedegarage.php');
exit;
}

la Location dans un header ca prend une URL absolue
cs_armenak Messages postés 58 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 25 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és 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
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és 58 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 25 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és 313 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 10 août 2013 1
3 déc. 2007 à 22:52
cs_armenak Messages postés 58 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 25 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és 193 Date d'inscription mercredi 24 août 2005 Statut Membre Derniè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és 313 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 10 août 2013 1
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és 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
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és 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
3 déc. 2007 à 16:59
Je noterai aussi à ce moment là :)
Bon courage
kiki67100 Messages postés 313 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 10 août 2013 1
3 déc. 2007 à 16:47
J'attent la mise a jour ! :)
je noterais a se moment là

++
cs_armenak Messages postés 58 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 25 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és 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
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és 313 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 10 août 2013 1
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és 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
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és 313 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 10 août 2013 1
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és 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
3 déc. 2007 à 13:26
Nan pas ereg() mais preg_replace()
cs_armenak Messages postés 58 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 25 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és 58 Date d'inscription vendredi 29 août 2003 Statut Membre Dernière intervention 25 octobre 2010
3 déc. 2007 à 13:16
Vous m'avez tué, merci...
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
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 :

$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...

++
cs_depression Messages postés 100 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 13 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

Ensuite, Il y a strpos()
Rejoignez-nous