Filtrer les mots

enky
Invité n'ayant pas de compte PHPfrance

21 août 2005, 14:40

C'est justement ce que je veux, arrete la page d'afficher s'il y a un gros mot trouvé dans $message :

echo "insultes interdits";
print("<p><a href=\"javascript:history.back()\">Retour</a>");
exit;

J'ai placé ton script juste après la validation du message. Là où je placais le script du remplacement de mot.

Je comprends pas d'où sort la variable $texte. Et pourquoi c'est pas la variable $message qui est comparé avec $grosmot ?

Mammouth du PHP | 19672 Messages

21 août 2005, 17:11

Il ne faut pas confondre les variables: $texte est ici définie dans le foreach et initialisée avec les valeurs du tableau $grosmots. Donc à chaque tour de la boucle, la valeur est ré-initialisée avec l'élément suivant du tableau.
Shématiquement, on pourrait écrire avec des variables plus "parlantes" foreach($tableau as $valeur). Tu pourrais même extraire les index avec foreach($tableau as $index => $valeur). Dans un tableau du genre
<?php
$tableau = array('a','b','c','d');
foreach($tableau as $index =>$valeur)
{
    echo("<p>L'élément ". $index ." du tableau \$tableau est ".  $valeur."</p>\n");
}
?>
Ce code va afficher:
L'élément 0 du tableau $tableau est a

L'élément 1 du tableau $tableau est b

L'élément 2 du tableau $tableau est c

L'élément 3 du tableau $tableau est d
Ensuite, au lieu d'un exit(), génère des messages d'avertissement et au lieu d'arrêter la page pour ne pas afficher le reste, gère le contenu que tu veux afficher pour fermer normalement le code de la page.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 2 Messages

22 août 2005, 21:52

Ca y est ! J'ai trouvé une méthode parfaite !!
On sait que la méthode 'remplacement' est très éfficace. Si on écrit xxcretinxxx, alors ce mot est censuré quand meme.

Comme je souhaite absolument la méthode de Ripat avec exit (mais qui a une faille), il suffit alors de combiner les 2 !

Je commence à remplacer les mots indésirables par # BAN # :
$banwords = Array('otre ke','elle et tro ','é tro ','né pas','c tro ','cé pa ',' ossi','pouvé','kestion','kon','fodra','pk','batar','cretin','idiot','AJOUTER AUTRES GROS MOTS ICI');
$message = str_replace($banwords, '# BAN #', $message);
Maintenant que les mots indésirables ont été remplacé par BAN avec espaces autour, ca ne posera plus de problème. Je mets le script de Ripat à la suite :
$banwords = array('BAN');
foreach ($banwords as $v){ 
$motif = '#\b'.$v.'\b#';
if (preg_match($motif, $message)) {
echo "Le langage SMS et les insultes sont interdits";
print("<p><a href=\"javascript:history.back()\">Retour</a>");
exit; }
}
Voilà, c'est génial maintenant ! Comme 9 messages sur 10 sur mon forum sont des messages écrits en sms, je gagne un temps considérable !
Merci à vous tous !

ViPHP
ViPHP | 1380 Messages

23 août 2005, 11:48

Faut quand même que je tempère ton enthousiasme sur ta "méthode parfaite".
  • Faire un str_replace pour insérer une balise pour ensuite vérifier si cette balise existe, c'est se compliquer singulièrement la vie et gaspiller de précieuses ressources.
  • faire un foreach sur un tableau d'un seul élément, idem.
  • Au risque de me répéter (voir plus haut) la technique du str_replace pour détecter des mots ne convient pas pour des phrases normalement constituées (avec de la ponctuation). Dans ton code, si tu interdis - à juste titre - le mot cul (pardon, mais c'est pour l'exemple... :oops: ), une phrase parlant d'agriculture sera censurée.
  • détecter, sans omission, tous les gros mots n'est déjà pas très facile (il faut les prévoir tous) mais, mettre en évidence l'utilisation d'un language sms, va te donner *beaucoup* de travail!
Relis et surtout essaye de bien comprendre l'utilisation des tableaux et de la regex donnée plus haut et tu trouveras une solution presque convenable.
ripat