Page 1 sur 3

Filtrer les mots

Posté : 04 août 2005, 19:00
par enky
Salut,
J'ai trouvé petit un livre d'or très simple en php, et j'aimerais ajouter un filtre de gros mots.

J'ai pensé à ce petit code :

if ($message == 'salaud') {die;}

Ca marche, mais...
Ca ne marche que si "le message contient ce mot unique".
Si c'est une longue phrase de plusieurs mots, alors ce code ne marchera plus.

J'aimerais savoir comment faire pour vérifier qu'un message entier ne contient pas ce mot.

Posté : 04 août 2005, 19:04
par raptor
Tu peu faire un array des mots a interdire :
$banwords = array("babla","bléblé","blublu");
et apres tu fait un
for($i=0;$i<count($banwords);$i++) {
 $message =  str_replace($banword[$i],"[Censuré]",$message);
}
@++

Posté : 04 août 2005, 19:07
par ouckileou
tu peux faire une méthode simple :

un tableau de mots à remplacer
un tableau de mots de remplacement
et str_replace
$message = 'cette ligne pourrait contenir de vilains mots';
$grosMots = Array(' abruti ', ' enfoiré ');
$rmeplacements = '#&$@!';
$message = str_replace($grosMots, $remplacement, $message);
j'ai mis des espaces donc normalement ça ne va pas remplacer ce qui fait partie d'un mot correct, exemple : concours

essaye déjà ça ;)

mais bon dis toi que les gens trouveront tjrs la parade... et que ça ne remplace pas la modération "à la main"

édition : en fait pas besoin de boucler comme dans l'exemple de raptor, ni d'un deuxième tableau comme dans celui que j'avais mis, si le remplacement est tjrs le même
une chaine remplacera chaque occurence trouvée

attention avec cette méthode, cela ne remplacera pas 'abruti,' avec une virgule si tu as mis des espaces autour
éventuellement pousser jusqu'au expressions régulières
mais mon avis personnel est que c'est "beaucoup" de travail pour pas grand chose :oops:

Posté : 04 août 2005, 19:38
par enky
La méthode de Raptor ne marche pas.

La méthode de ouckileou ne marche que si on enleve la 1er ligne et qu'on ne mette pas d'espace autour des gros mots :

Le code qui marche bien est donc :
$grosMots = Array('abruti', 'enfoiré');
$rmeplacements = '#&$@!';
$message = str_replace($grosMots, $remplacement, $message);
Si on met des espaces, alors les gros mots tout seul ne marcheront pas.

Posté : 04 août 2005, 19:46
par enky
Une dernière chose. Les messages écrit en majuscules sont difficiles à lire.

Est-ce qu'il est possible de transformer toutes les lettres majuscules en miniscules ?

Posté : 04 août 2005, 20:04
par ouckileou
majuscules => minuscules : strToLower

et effectivement ma technique ne marchait que pour les mots entourés d'espaces
comme je l'ai dit si tu veux prendre en compte tous les cas de figure, regarde les expressions régulières

Posté : 04 août 2005, 20:36
par enky
Il y a une solution pour le mot "con" : mettre un espace après.
Dans le mot "majuscule", il y a aussi un gros mot. Donc je mets un espace avant.
Pour les autres mots, c'est à censurer bêtement.
$grosMots = Array('abruti', 'enfoiré','con ',' cul');
$remplacement = '#&$@!';
$message = str_replace($grosMots, $remplacement, $message);
Si le mot con est tout seul, c'est que c'est un gros mot. Sinon ca peut etre : concours.


J'ai pas compris comment utiliser la fonction majuscules => minuscules : strToLower

Posté : 04 août 2005, 20:54
par ouckileou
oui mais si ton mot est suivi d'une virgule => ça ne marche plus

mais bon comme je le disais, ça permet déjà d'enlever le plus gros, ensuite les gens trouveront une parade s'ils veulent vraiment être grossier

pour la fonction strToLower, est tu allé voir dans la doc ?
=> http://fr.php.net/manual/fr/function.strtolower.php

c'est une fonction tout ce qu'il y a de plus simple, le fonctionnement est assez facile à comprendre je pense ;)

Posté : 04 août 2005, 21:22
par enky
C'est mieux que rien.
Si la surprise ne marche qu'une fois, pas de probleme, chaque IP ne peut poster qu'un seul message dans mon livre d'or.

C'est bon pour la fonction strtolower, ca marche.

$str = $message;
$str = strtolower($str);
$message = $str;

Posté : 04 août 2005, 22:53
par raptor
J'avais oublié un s, tu aurais pu le rajouter :)
$banwords = array("babla","bléblé","blublu");

for($i=0;$i<count($banwords);$i++) {
$message =  str_replace($banwords[$i],"[Censuré]",$message);
}

Posté : 11 août 2005, 20:16
par Enky
Merci à vous deux.

J'aimerais modifier ce script. Au lieu de remplacer, j'aimerais tout simplement interdire l'envoi du message.

Si le message $message contient un de ces mots : 'cretin', 'idiot' ou 'imbecile', alors :
{ break; }

Comment fait-t-on ?

Posté : 11 août 2005, 20:33
par Ripat
La seule manière rapide et efficace de trouver des mots dans un texte tout en tenant compte de la ponctuation et des débuts ou fins de phrases est d'utiliser l'assertion \b dans le motif de la regex.

Voir à ce sujet http://www.phpfrance.com/forums/voir_su ... .php#44272

Ceci étant dit, voici deux solutions:
$message = 'IDIOT autre texte';
$banwords = array('cretin', 'idiot', 'imbecile');

// le plus court:
$motif = '#\b(?:'.implode('|', $banwords).')\b#i';
if (preg_match($motif, $message)){
  exit; // ou toute autre instruction d'arrêt
}

// le plus efficace
foreach ($banwords as $v){
  $motif = '#\b'.$v.'\b#i';
  if (preg_match($motif, $message)){
    exit; // ou toute autre instruction d'arrêt
  }
}
Pour une explication sur la raison de l'efficacité plus grande de la deuxième solution, lire ici

Posté : 11 août 2005, 21:51
par enky
Je viens de tester la 2e méthode. Ca marche très bien, meme trop bien.
Que ce soit en majuscule ou minuscule, les gros mots sont tous rejetés.
Donc excellent !!

Posté : 11 août 2005, 22:25
par smarties
$banwords = array("babla","bléblé","blublu");
$message =  str_ireplace($banwords,"[Censuré]",$message);
Tu peux aussi tenter ça :wink: la casse est ignorée.

Posté : 11 août 2005, 22:44
par Cyrano
$banwords = array("babla","bléblé","blublu");
$message =  str_ireplace($banwords,"[Censuré]",$message);
Tu peux aussi tenter ça :wink: la casse est ignorée.
Si tu regardes bien la solution de Ripat, l'option "i" rend le regex insensible à la casse ;)