Filtrer les mots

enky
Invité n'ayant pas de compte PHPfrance

04 août 2005, 19:00

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.

Mammouth du PHP | 543 Messages

04 août 2005, 19:04

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);
}
@++

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 19:07

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:

enky
Invité n'ayant pas de compte PHPfrance

04 août 2005, 19:38

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.

enky
Invité n'ayant pas de compte PHPfrance

04 août 2005, 19:46

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 ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 20:04

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

enky
Invité n'ayant pas de compte PHPfrance

04 août 2005, 20:36

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

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 20:54

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 ;)

enky
Invité n'ayant pas de compte PHPfrance

04 août 2005, 21:22

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;

Mammouth du PHP | 543 Messages

04 août 2005, 22:53

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);
}

Enky
Invité n'ayant pas de compte PHPfrance

11 août 2005, 20:16

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 ?

ViPHP
ViPHP | 1380 Messages

11 août 2005, 20:33

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
ripat

enky
Invité n'ayant pas de compte PHPfrance

11 août 2005, 21:51

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 !!

Eléphant du PHP | 199 Messages

11 août 2005, 22:25

$banwords = array("babla","bléblé","blublu");
$message =  str_ireplace($banwords,"[Censuré]",$message);
Tu peux aussi tenter ça :wink: la casse est ignorée.
Les 2 font la paire : coder ET commenter :wink:

Mammouth du PHP | 19672 Messages

11 août 2005, 22:44

$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 ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: