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.
Au final j'ai réussi, merci
if(!preg_match("#fdp|pd|^con$#i", $comment)){
}
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.
Bonjour, désolé mais je n'ai pas compris l'histoire de table wordfilter je ne trouve rien sur internet
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.
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é....
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
++
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 ?
++
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"
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'].'"');
}
}
}
}
}
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 ($).
Par exemple j'ai ça, donc je fais comment avec ^ et $
#fdp|pd|con#i
comme ça?
#fdp|pd|^con$#i
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.
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 ! :)
Bonjour.
Pour information, concernant les expressions régulières, tu peux utiliser ce site : Regex Tester Tool.