Remplacement de caractères exact

Avatar du membre
ViPHP
ViPHP | 3008 Messages

08 févr. 2005, 22:46

Bonsoir,

J'ai un petit soucis que je n'arrive pas à résoudre. J'ai un petit chat et je voudrais censurer les gros mots en les remplaçant par un smiley.

J'ai trouvé ce petit code :
$bannir = "crotte|caca|merde|conne";
$blurb = "<img src=../images/smiles/censure.gif>";
$msg= preg_replace("/(^|[^a-zA-Z])($bannir)([^a-zA-Z]|$)/si",'\\1'.$blurb.'\\3',$msg);
Il remplace bien les mots correspondants mais voilà le hic, il me remplace aussi par exemple "déconne" en mettant "dé+le smiley", or je voudrais que seule le mot "conne" soit remplacé...

Avez-vous une petite idée ?

merci pour votre aide :wink:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

08 févr. 2005, 23:06

Salut,

Va faire un tour sur http://www.expreg.com (Nos regex / Chaines de caractères), il y a une version 2 du script de banissement de mots qui semble convenir à ce que tu cherches.
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 févr. 2005, 10:06

Merci beaucoup, je vais jeter un oeil et je te tiens au courant ;)

ViPHP
ViPHP | 1380 Messages

09 févr. 2005, 10:14

Bonjour,

La raison de ton problème est que dans ton motif, la classe de caractères
[^a-zA-Z] comprend les accentués. Dans le mot déconne la regex prendra le é comme séparateur de mots (puisqu'il correspond à la classe négative plus haut).

Plusieurs solutions:
//  avec la classe \w (tous les alpha-num) insensible à la casse
$new_msg= preg_replace("/(^|[^\w])($bannir)([^\w]|$)/", '\\1'.$blurb.'\\3', $msg);

// plus simplement avec l'assertion \b (séparateur de mots)
$new_msg= preg_replace("/\b($bannir)\b/i", $blurb, $msg);
Attention, pour que \w et \b fonctionnent correctement il faut que ton serveur utilise le jeux de caractères français. Si ça ne marche pas, ajoutes:
setlocale(LC_CTYPE, 'fr_FR.ISO-8859-1');
Voilà, mon premier post :wink:
ripat

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 févr. 2005, 10:27

Merci, j'ai un soucis de transfert en ce moment mais je vais tester tout ça dès que ça sera rétabli. :wink:

Eléphanteau du PHP | 23 Messages

09 févr. 2005, 12:54

<?php

// Les mots à censurer
$bannir = "crotte|caca|merde|conne";

// Le texte de la censure
$blurb = "<img src=../images/smiles/censure.gif>";

// L'expression régulière
$reg="!(^|\s)($bannir)($|\s)!i";
// Avant et après le mot, il doit y avoir un blanc
// ou une extrémité du message

// Le remplacement
$msg=preg_replace($reg,'$1'.$blurb.'$3',$msg);

?>
Image

ViPHP
ViPHP | 1380 Messages

09 févr. 2005, 14:51

// Avant et après le mot, il doit y avoir un blanc

// ou une extrémité du message[/quote]Comme tu le dis il faut un espace (ou retour ligne ou tab, tous contenus dans la classe \s)..

Les mots interdits suivis par un signe de ponctuation ne seront donc pas détectés.

Comme séparateur de mots, je pense que l'assertion \b est la plus indiquée dans ce cas. Ou, éventuellement \W (mais lui, il consomme un caractère ce qui n'est pas le cas de \b)
ripat

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 févr. 2005, 17:13

hello !

j'ai testé un peu tous les codes, et celui ci (de ripat) semble marcher correctement :

Code : Tout sélectionner

$new_msg= preg_replace("/\b($bannir)\b/i", $blurb, $msg);
Par contre une autre dernière tite question et après ça devrait être tout bon, comment faire pour qu'il reconnaisse la casse et le pluriel...? Je ne m'y connais pas du tout en expression... :oops:

merciii :wink:

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 févr. 2005, 17:25

oups autant pour moi, la casse fonctionne et pour le pluriel j'ai rajouté :

Code : Tout sélectionner

$msg= preg_replace("/\b(".$bannir.")s?\b/i", $blurb, $msg);
Tout marche bien pour le moment.

Merci à tous :wink: