Filtre à gros mots pour livre d'or

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 391 fois - Téléchargée 17 fois

Contenu du snippet

J'ai 54 ans et c'est mon premier post, j'en tremble encore...
C'est une fonction toute bête qui filtre les gros mots, à placer jute avant l'insert dans la page d'insertion d'un message d'un livre d'or ou d'un forum. Évidemment, là où l'anti-spam de Google se casse les dents, cette fonction se les casse aussi. Si le mot est dans la liste, le message sera interdit, mais s'il ne l'est pas ou orthographié différemment, il passera. Un ami à moi ne voulait pas entendre parler de son divorce sur son forum perso et tous les messages contenant ce mot ont été effectivement interdits, mais il a fallu qu'il rajoute séparation et le nom de son ex... Cependant en ce qui concerne les messages laissés sur les livres d'or et les forums par les robots spammeurs, c'est efficace à 100%

Source / Exemple :


<?php
function anti_grosmots($texte,$fichier,$rep) {
//on mets en minuscules et on enlève les accents
$texte = strtolower(OterAccents($texte));
//on élimine d'office http (robots spammeurs) et les caractères éventuels laissés par htmlentities
if(preg_match("/http/i", $texte || preg_match("/<b>/i", $texte))
{		
	header("Location:$rep");
	exit;
}	
$liste = file_get_contents($fichier);
$tab = explode("\r\n", $liste);
foreach($tab as $mot)
	{		
		if (preg_match("/^$mot$/i",$texte))
			{		
			header("Location:$rep");
			exit;
			}	
	}
}
?>

Conclusion :


Quand les mises à jour seront finies, j'ajouterai le fichier d'insert, pour ceux qui ne savent pas (si, si, il y en a).

A voir également

Ajouter un commentaire

Commentaires

cs_depression
Messages postés
100
Date d'inscription
mardi 7 novembre 2000
Statut
Membre
Dernière intervention
13 juillet 2009
-
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()
webdeb
Messages postés
509
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
3 -
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_armenak
Messages postés
58
Date d'inscription
vendredi 29 août 2003
Statut
Membre
Dernière intervention
25 octobre 2010
-
Vous m'avez tué, merci...
cs_armenak
Messages postés
58
Date d'inscription
vendredi 29 août 2003
Statut
Membre
Dernière intervention
25 octobre 2010
-
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.
webdeb
Messages postés
509
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
3 -
Nan pas ereg() mais preg_replace()

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.