Filtrer des insultes dans une chaîne

Par MrSaooty, il y a 12 ans


Bonjour, je cherche un petit coup de main car j'ai tout essayé mais je ne trouve pas de solution à mon problème.

J'ai donc un système de dédicace et j'aimerais filtrer les insultes.

L'utilisateur entre son pseudo, son message. J'aimerais que son message soit analysé qu'il soit comparé à une liste de mot interdit et si ces un de ces mots interdits est dans la chaîne on annule l'envoie du message.

J'ai essayé quelque fonctions, et les regex mais j'ai beaucoup de mal avec les regex.

15 réponses

MehdiWEB, il y a 12 ans

Tu crée une table worldfilter dedans tu stock les mots a filtrer et dans ton code tu analyse le message avec une condition qui va vérifier si dans le message il y'aurai un mot qui se trouverai dans la table worldfilter.

MrSaooty, il y a 12 ans

Bonjour, désolé mais je n'ai pas compris l'histoire de table wordfilter je ne trouve rien sur internet

MehdiWEB, il y a 12 ans

Tu crée une table worldfilter avec dedans deux collones: id,value
Et dans ton code PHP tu sélectionné la table worldfilter puis tu exécuté une conditions qui va vérifier si le mot se trouve dans la table.

MrSaooty, il y a 12 ans

Mais la requete sql va verifier si le message entier est présent dans une ligne de la bdd, et ça ne sera pas le cas.
Je pense qu'il y a des solutions plus adaptées.

Par exemple dans mon système j'interdit des pseudos, de cette façon.

$forbiden_username = array("pseudo1", "pseudo2", "pseudo3", "...");
if(!in_array(strtolower($author), $forbiden_username, true)){
    // code à exec
}

Si le pseudo est pseudo1 ou pseudo 2 ou pseudo3..., on n'envoie pas le message.

Le problème c'est que je ne peux pas faire ça avec des mots, pourquoi ?

$forbiden_words = array("fdp", "pd", "...");

Par exemple ce bout de code va bloquer un message de type "pd", mais si l'utilisateur écrit "hey pd" ça ne sera pas filtré....

Roooh, il y a 12 ans

Salut,

Pour eviter le genre de problème comme tu viens de dire dans ton dernier message, tente la technique avec le % ou ^ avant et après si je me trompe pas.

SQLement (Nouveau mot Ahah) parlant, on peut faire des recherches pour les chaines de caractères contenant certains caractères que tu souhaite "sélectionner". Sauf si je me trompe

++

MrSaooty, il y a 12 ans

Au final j'ai réussi, merci

if(!preg_match("#fdp|pd|^con$#i", $comment)){
}
Roooh, il y a 12 ans

Si tu as résolu ton problème, c'est une bonne chose ;)

Avec ce morceau là, tu peux donc filtrer tous les mots que tu y mets dedans alors ?

++

MrSaooty, il y a 12 ans

Oui je peux donc filtrer tous les mots. Et si un de ces mots se trouve à l'intérieur d'une phrase, il est bien détecté. Et c'est insensible à la casse grace au petit "i" à la fin. "#fdp|pd|con# i"

MehdiWEB, il y a 12 ans

Je suis un peux occuper en ce moment donc je te donne un petit bout de code que j'avais réaliser pour un ANTIPUB tu pourra te baser dessus.

$date_ac = time();
$date_calcul = 100008 * 3600;
$date_ban = $date_ac + $date_calcul;
$filtre = mysql_query('SELECT word FROM wordfilter');
while ($filtred = mysql_fetch_array($filtre))
{
    $filtred'word'] = str_replace('.', '', $filtred'word']);
    @$mots_filtres .= $filtred'word'].',';
}
$mots = explode(',', $mots_filtres);
$chat = mysql_query('SELECT id, message, user_name FROM chatlogs WHERE aldryview = "0" ORDER BY id DESC');
while ($logs = mysql_fetch_array($chat))
{
mysql_query("UPDATE chatlogs SET aldryview = '1' WHERE id = '".$logs'id']."' LIMIT 1");
    $message = $logs'message'];
    for ($i=0;$i<count($mots)-1;$i++)
    {
        $logs'message'] = str_replace('.', '',$logs'message']);
        $logs'message'] = str_replace(' ', '',$logs'message']);
        $logs'message'] = str_replace('/', '',$logs'message']);
        $logs'message'] = str_replace('"', '',$logs'message']);
        $logs'message'] = str_replace('*', '',$logs'message']);
        $logs'message'] = str_replace('_', '',$logs'message']);
        $logs'message'] = str_replace(',', '',$logs'message']);
        $logs'message'] = str_replace("'", '',$logs'message']);
        $logs'message'] = str_replace('!', '',$logs'message']);
        $logs'message'] = str_replace('%', '',$logs'message']);
        $logs'message'] = str_replace(':', '',$logs'message']);

        if (stristr($logs'message'], $mots$i]) !== FALSE)
        {
            $queryy = mysql_fetch_array(mysql_query('SELECT ip_last,id,rank FROM users WHERE username = "'.$logs'user_name'].'"'));
            $requete = mysql_query('SELECT * FROM bans WHERE value = "'.$queryy'ip_last'].'"');
            $avert = avertos($queryy'id']);
            if($queryy'rank'] <= 2){
            if (mysql_num_rows($requete) < 1 && $avert == "BAN")
            {
                mysql_query('INSERT INTO bans (bantype, value, reason, expire, added_by, added_date, appeal_state) 
                VALUES("ip", "'.$queryy'ip_last'].'", "Publicité interdite!-'.$mots$i].','.$logs'message'].']", "'.$date_ban.'", "Robot PUB", "", "1")');
                MUS('signout', $queryy'id']);               
                MUS('reloadbans', '');          
                mysql_query('DELETE FROM chatlogs WHERE id = "'.$logs'id'].'"');
            }
            }
        }
    }
}
Arrows78, il y a 12 ans

Fais bien attention à vérifier tous les mots précisement, fait gaffe à l'expression régulière que tu marque, car si certaines mots contiennent notamment "con", ça risque de planter. Utilise bien le caractère de début (^) et de fin ($).

MrSaooty, il y a 12 ans

Par exemple j'ai ça, donc je fais comment avec ^ et $

#fdp|pd|con#i

comme ça?

#fdp|pd|^con$#i
Arrows78, il y a 12 ans

Désolé pour ce retour tardif, je n'avais pas vu qu'un message avait été posté.

Oui, en faisant de cette manière, tu évitera de bloquer tous les mots contenant les lettres "con", comme "contien" par exemple.

Xen0risDEV, il y a 12 ans

Bonjour,
Pour filtré certaine insulte il serrait préférable de les ajouter dans une table de donnée, comme ça à chaque ajout de mot interdit, le script l'ajoute automatiquement.

Exemple : Ma base de donnée s'appelle "Conf" dedans j'ai : "Nom du site, Tags du site, Description, Version, Filtre anti-gros mot / autre"
Alors je fait ceci :

Mais mot interdit :
Porno;Sexe;con;connard;merde

je veux donc enlever les ;, puis transformé mon "forbiden_words" en un tableaux alors :

<?php
$forbiden_words = $BDD->query("SELECT forbiden_words FROM Conf");
$forbiden_words = explode(';', $forbiden_words);
$REGEX = '/'.implode('|', $forbiden_words).'/i'; //Ont créer un pattern REGEX
$VERIFICATION = preg_match($pattern, $message); // Ont mais tout dans le preg_match est ensuite nous allons procédé au vérification !
if($VERIFICATION) {
    print('Pas trop vite coco des mots censurer ont été découvert !');
} else {
    print('Très bien ! ');
}
?>

Voilà cordialement ! :)

Lartak, il y a 12 ans

Bonjour.
Pour information, concernant les expressions régulières, tu peux utiliser ce site : Regex Tester Tool.

MrSaooty, il y a 12 ans

Ha oui nice ça, merci !:)