Filtrer les mots

enky
Invité n'ayant pas de compte PHPfrance

11 août 2005, 23:03

Oui, ca c'est une méthode donné tout au début par Raptor : le remplacement.
J'ai déjà compris. C'était ma 1er question.

Mais actuellement, je suis à la 2e question : faire exit; si le message contient un gros mot. (Ripat vient de me répondre).

----------------------------------------------------------------------------

Pour la méthode de Ripat, est-il possible d'interdire ces 2 mots en majuscules : OUI, NON. Uniquement ces 2 mots en majuscules. Les autres mots sont tous autorisés en majuscules.

Je commence par ceci, et après je sais pas :

$banwords = array('OUI', 'NON');

Eléphanteau du PHP | 13 Messages

12 août 2005, 00:54

<?php
$forbidden=array('mot1','mot2','mot3',);
echo (strpos($var,$forbidden))?'Mots interdits':$var;
?>
[/php]
Image

enky
Invité n'ayant pas de compte PHPfrance

12 août 2005, 01:54

Non, ca c'est pour remplacer, mais moi je veux faire break; pour éviter que le message ne soit envoyé.

La méthode de Ripat était bien, mais elle bloque les mots en majuscules et minuscules en meme temps.
Moi je veux juste bloquer une selection de mot en majuscule.

ViPHP
ViPHP | 1380 Messages

12 août 2005, 08:11

Non, ca c'est pour remplacer, mais moi je veux faire break; pour éviter que le message ne soit envoyé.

La méthode de Ripat était bien, mais elle bloque les mots en majuscules et minuscules en meme temps.
Moi je veux juste bloquer une selection de mot en majuscule.
Relis le post de Cyrano, il t'a donné l'explication de la sensiblité à la casse (minuscule/majuscule).
ripat

enky
Invité n'ayant pas de compte PHPfrance

12 août 2005, 12:31

Donc dans
$motif = '#\b'.$v.'\b#i';

j'enlève tout simplement le i ?

ce qui donne
$motif = '#\b'.$v.'\b#';

C'est tout ?

Mammouth du PHP | 543 Messages

12 août 2005, 12:34

Le mieux est de tester, ca prend 2 secondes en plus.

enky
Invité n'ayant pas de compte PHPfrance

12 août 2005, 16:36

oui, j'ai déjà testé avant. Ca marche, mais je ne comprends pas la signification de ce i.

ViPHP
ViPHP | 1380 Messages

12 août 2005, 20:29

ripat

enky
Invité n'ayant pas de compte PHPfrance

19 août 2005, 19:25

$banwords = array('cretin', 'idiot', 'imbecile');

// le plus court:
$motif = '#\b(?:'.implode('|', $banwords).')\b#i';
if (preg_match($motif, $message)){
  exit;
}

// le plus efficace
foreach ($banwords as $v){
  $motif = '#\b'.$v.'\b#i';
  if (preg_match($motif, $message)){
    exit;
  }
}
Je me suis rendu compte de l'inéfficacité de ce script.
En effet, il suffit que les gens écrivent idiote à la place de idiot pour que ca ne soit pas pris en compte.

Pourtant le script du remplacement ne connait pas ce problème.

ViPHP
ViPHP | 1380 Messages

20 août 2005, 11:00

:shock:

Ben, oui, évidemment. Si le mot interdit ne se trouve pas dans le tableau de départ....

Un petit coup de pouce pour les féminins:
$banwords = array('cretine?', 'idiote?', 'imbecile?'); 
Le e est rendu optionnel.
ripat

enky
Invité n'ayant pas de compte PHPfrance

20 août 2005, 19:32

Pourtant, la méthode de remplacement marche très bien :

$grosmot = Array('cretin', 'idiot', 'imbecile');
$message = str_replace($grosmot, '**censuré**', $message);

Si on écrit cretine, alors ca affiche : **censuré**e

Aucun problème !

Pourquoi la méthode de exit ne marche pas comme ça ?

Il n'y a pas un moyen de vérifier au mileu d'un mot ?

Par exemple, vérifier que ce message ne contient pas de gros mot : xxxx xxx xxxcretinxxx xxx xxx

PS : J'insiste sur la méthode d'exit (celle de Ripat), elle est vraiment bien. Ca me fait gagner un temps considérable.

enky
Invité n'ayant pas de compte PHPfrance

21 août 2005, 11:53

J'ai pensé à ces quelques méthodes qui ne marche pas :
$grosmot = Array('cretin','imbecile','idiot'); 
$messagepropre = str_replace($grosmot, '***censuré***', $message); 
if ($message != $messagepropre) exit;
-> problème : ca fait exit dès le chargement de la page.

$grosmot = array('cretin','imbecile','idiot');
foreach ($grosmot as $texte) {
$comparaison = ereg ($message,$texte);
if($comparaison) exit();
}
-> message d'erreur à la ligne $comparaison = ereg ($message,$texte);

Quelqu'un pour me corriger ? :-k

Mammouth du PHP | 19672 Messages

21 août 2005, 12:28

Pour la première, tu fais un nettoyage avec str_replace mais ça ne sert à rien puisque si un des mots bannis est trouvé, ça arrête l'application ensuite. Shéma pas vraiment logique.

Pour la seconde formulation, ereg() attends une expression rationnelle en premier paramètre et tu lui mets une chaine directe. Essaye comme ceci:
<?php
function censure($msg)
{
    $grosmot = array('cretin', 'crétin','imbecile', 'imbécile','idiot');
    $nb_gm = 0;
    foreach ($grosmot as $texte)
    {
        $texte = "^.*(". $texte .")e?.*$";
        if(ereg ($texte,$msg))
        {
            $nb_gm++;
        }
    }
    $message = ($nb_gm > 0) ? ("<p>Mots interdits trouvés dans le texte soumis, message censuré !</p>") : "<p>". $msg ."</p>\n";
    return $message;
}
$message1 = "Ce type est le plus parfait imbécile et sa femme est l'idiote du village";
$message2 = "Ce type est le plus parfait gentleman et sa femme est la meilleure des hôtesses";

echo(censure($message1));
echo(censure($message2));
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

enky
Invité n'ayant pas de compte PHPfrance

21 août 2005, 13:49

Ca ne marche que sur tes 2 exemples. Mais pas sur le message posté : $message

Et puis, il ne fait pas exit;

Mammouth du PHP | 19672 Messages

21 août 2005, 14:05

exit() arrête l'application, je ne suis pas certain que ce soit le but du jet sur une page web parce que ça arrête aussi la génération de la page qui sera donc incomplète.

Quant au fonctionnement sur le message envoyé, ça me parait curieux: comment as-tu testé ces lignes ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: