IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Supprimer les insultes dans un texte oui mais...


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut Supprimer les insultes dans un texte oui mais...
    Bonjour,

    Je veux filtrer les commentaires postés sur mon site.
    Pour cela je viens d'essayer la fonction str_replace.

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $post="Il est con"  //  (désolé c'est pour l'exemple).
    $post=str_replace("con", "génial", "$post");
    là nous obtenons "il est génial". C'est bien.

    Autre exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $post="Il est content" 
    $post=str_replace("con", "génial", "$post");
    Là nous obtenons "il est génialtent". C'est nul.


    Vous aurez deviné la question: comment supprimer une chaine de caractère seulement si elle est seule et donc non inclue dans une autre ?

    j'ai essayé à tout hasard de rajouter des espaces autour du mot à isoler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $post=str_replace(" con ", "génial", "$post")
    ça n'a pas fonctionné.
    C'est pas parce que j'ai tort que vous avez raison.

  2. #2
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Et puis si on essaie avec sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $post="Il est c0n"  //  (désolé c'est pour l'exemple). 
    $post=str_replace("con", "génial", "$post");
    Sa ne fonctionne pas plus :/

    Ceci dit tu peut essayer de faire une fonction qui vas vérifier mot à mot.


    <?php
    function&#160;antigrosmots($strstr)
    {

    $tabgrosmots&#160;=&#160;array();
    $tabgrosmots["con"]&#160;=&#160;"génial";

    $tabstr&#160;=&#160;explode("&#160;",$strstr);
    for(
    $i=0,$n&#160;=&#160;count($tabstr);&#160;$i&#160;<&#160;$n;&#160;$i++)
    {
    if(&#160;isset(
    $tabgrosmots[$tabstr[$i]])&#160
    {
    $tabstr[$i]&#160;=&#160;$tabgrosmots[$tabstr[$i]];
    }
    }
    return&#160;
    implode("&#160;",$tabstr);
    }
    ?>
    Pour les fameux gros mots mal ortographié, j'avais lu dan un article qu'il existait desméthodes pour y palier..
    Je vais cherche mais se sera couteux en performances tout cela :/

    bye

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Merci pour ta réponse,

    j'étais parti pour faire ça avec un tableau aussi. Demain matin j'essaie ton script, je vous dirai le résultat.

    Pour les performances ça n'est pas trop un problème je crois, car ce sera exécuté avant l'envoi du formulaire dans la base.
    C'est pas parce que j'ai tort que vous avez raison.

  4. #4
    Membre éclairé Avatar de Death83
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 667
    Points : 878
    Points
    878
    Par défaut
    le mieu se serai d'utiliser des expressions régulières .
    manganimes (en construction) -
    zemanga

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Points : 1 504
    Points
    1 504
    Par défaut
    Puis pour éviter le problème de casse, tu peux toujours convertir ta chaîne ne minuscule avant le test avec strtolower il me semble mais ca fait longtemps que j'ai pas fait de php...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    La dernière idée est bonne il me semble.
    C'est pas parce que j'ai tort que vous avez raison.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Avec les regex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $post = "Il est content";
    $post = preg_replace("#\bcon\b#i", "génial", $post);
    Marchera avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Il est con ce type
    Il est con.
    Con!
    La présence de la ponctuation n'est pas innocente. Elle met en évidence l'utilité de l'assertion \b (séparateur de mot) qui comprend l'espace, la ponctuation et les ancrages de début et de fin de chaîne. L'option i (derrière le délimiteur #) rend la regex insensible à la casse.
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  8. #8
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Est-ce que le replace respecte la casse ?
    "con" => "génial"
    "Con" => "Génial"
    ???

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par Mr N.
    Est-ce que le replace respecte la casse ?
    "con" => "génial"
    "Con" => "Génial"
    ???
    Non

    Mais pas impossible à faire. J'y réfléchi, juste pour le fun. En attendant voici une variation sur le thème regex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $motsInterdits = array(
      'con',
      'idiot',
      'rustre',
      'cuistre'
    );
     
    // préparation des motifs de la regex
    foreach($motsInterdits as $k=>$v){
      $motsInterdits[$k] = '#\b'.$v.'\b#i';
    }
     
    $post = "Il est content mais plus con que cuistre!";
     
    $post = preg_replace($motsInterdits, '****', $post);
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Voilà, juste pour le sport car je doute de l'utilité du truc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    $mots = array(
      'con'     => 'sot',
      'idiot'   => 'niais',
      'balourd' => 'rustre',
      'poseur'  => 'cuistre'
    );
     
    $de   = array_keys($mots);
    $vers = array_values($mots);
     
    function maVerif($captures){
      global $de;
      global $vers;
      $mot = $captures[0];
      $indice = array_search(strtolower($mot), $de);
      if ($mot == strtoupper($mot)){
        return strtoupper($vers[$indice]);
      }elseif($mot[0] == strtoupper($mot[0])){
        return ucfirst($vers[$indice]);
      }else{
        return $vers[$indice];
      }
    }
     
    foreach($de as $k=>$v){
      $motsInterdits[$k] = '#\b'.$v.'\b#i';
    }
     
    $post = "Cet idiot est content mais plus Con que POSEUR!";
     
    $post = preg_replace_callback($motsInterdits, "maVerif", $post);
    Il y a toujours un petit problème avec la fonction strtoupper('école') qui donnera éCOLE. Mais c'est facile à résoudre.

    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    ripat:
    Voilà, juste pour le sport car je doute de l'utilité du truc.
    Pourquoi doutes-tu de l'utilité de la chose ?

    ripat
    :
    $post = "Il est content";
    $post = preg_replace("#\bcon\b#i", "génial", $post);
    Je viens d'essayer ça fonctionne bien. C'est ce que j'avais essayé de faire en placant des espaces, mais je n'avais pas eu l'idée de les coder (de toute façon je ne savais pas le faire, ceci expliquant cela).
    C'est pas parce que j'ai tort que vous avez raison.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par psychoBob
    Pourquoi doutes-tu de l'utilité de la chose ?
    :

    Parce que je pensais que tu souhaitais remplacer les motes interdits par **** comme il se fait habituellement. Mal compris ta question.

    Enfin, tu as une solution maintenant.

    Pour école->éCOLE il faut que tu remplaces strtouper() par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function monStrtoupper($txt){
      $accents = 'áéíóúýÁÉÍÓÚÝàèìòùÀÈÌÒÙäëïöüÿÄËÏÖÜâêîôûÂÊÎÔÛåÅøØßçÇãñõÃÑÕ';
      $sans =    'aeiouyAEIOUYaeiouAEIOUaeiouyAEIOUaeiouAEIOUaAoOscCanoANO';
      return strtoupper(strtr($txt, $accents, $sans));
    }
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    psychoBob a écrit:
    Pourquoi doutes-tu de l'utilité de la chose ?

    :
    Parce que je pensais que tu souhaitais remplacer les motes interdits par **** comme il se fait habituellement. Mal compris ta question.
    L'important est de les enlever, effectivement "****" est une bonne solution, même si je ne l'ai jamais rencontré.

    Je m'inquiète plutot de l'acharnement dont sont capables certains, qui, voyant que leur insulte n'est pas passée, essaye et réessaye sans cesse jusqu'à en trouver une qui passe.
    D'ailleur il suffit d'écrire "quel gros Kon" pour que ça fonctionne.
    On arrête pas le progrès.
    C'est pas parce que j'ai tort que vous avez raison.

  14. #14
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    peut etre peut tu te servir de ça : http://fr2.php.net/soundex pour ce genre de detection
    Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.

    Cours | FAQ | Sources Javascript
    Cours | FAQ | Sources PHP
    Mes Articles

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Ah oui, c'est une très bonne idée que celle-ci.

    Par contre tout cela mis bout à bout commence à faire un script assez compliqué pour le débutant que je suis.

    Une fois le système de commentaire terminé je vais voir si il y a beaucoup de plaisantins, si c'est le cas j'utiliserai un script aussi complet que cela (j'ai quand même une admin pour supprimer les messages, mais avant que je ne les supprime, ils peuvent rester quelques heures en ligne).

    Je ne marque pas "résolu" tout de suite, dès fois que d'autres veuillent participer ou si j'ai des questions à poser.

    Merci pour vos réponses en tout cas.
    C'est pas parce que j'ai tort que vous avez raison.

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par siddh
    peut etre peut tu te servir de ça : http://fr2.php.net/soundex pour ce genre de detection
    Bonne idée mais la fonction soundex() de php est basées sur les phonèmes anglais. Elle n'est donc pas adaptée au français.

    J'ai travaillé dans ma jeunesse (eh, oui!) sur des algo de dédoublement de fichiers d'adresses et j'avais développé une routine COBOL (deuxième soupir...) de phonétisation des mots. Ca a du prendre la poussière.

    Ce serait bien d'avoir une fonction soudex en français. Je fais des recherches...
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  17. #17
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    merci pour les précisions
    Alunissage : Procédé technique consistant à déposer des imbéciles sur un rêve enfantin.

    Cours | FAQ | Sources Javascript
    Cours | FAQ | Sources PHP
    Mes Articles

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Je fait remonter ce post car j'ai besoin d'utiliser la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $motsInterdits = array(
      'con',
      'idiot',
      'rustre',
      'cuistre'
    );
     
    // préparation des motifs de la regex
    foreach($motsInterdits as $k=>$v){
      $motsInterdits[$k] = '#\b'.$v.'\b#i';
    }
     
    $post = "Il est content mais plus con que cuistre!";
     
    $post = preg_replace($motsInterdits, '****', $post);

    Mais elle ne retourne rien. Où se trouve l'erreur ?
    C'est pas parce que j'ai tort que vous avez raison.

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut mise en majuscules lettres accentuées
    RTFM ;-]

    Je cite : « (…) strtoupper() retourne string , après avoir converti tous les caractères alphabétiques en majuscules.

    Notez que la notion d'"alphabétique" est déterminée par la configuration de localisation. Cela signifie que pour la configuration par défaut "C", les caractères tels que les voyelles accentuées (comme é, è ou à) ne seront pas converties. (…) »

    cf http://fr.php.net/manual/fr/function.strtoupper.php

    Dont on déduit qu'un setlocale(LC_ALL, 'fr_FR@euro') ou setlocale(LC_ALL, 'fr') (merci M$) doit nous sauver les miches (sans compter qu'il doit être plus performant) avant de faire un STRTOUPPER(), plutôt qu'un STRTR.

    Je suis bien placé, j'avais fait la même ân* ! :,-(


    Citation Envoyé par ripat Voir le message
    :

    (…)

    Pour école->éCOLE il faut que tu remplaces strtouper() par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function monStrtoupper($txt){
      $accents = 'áéíóúýÁÉÍÓÚÝàèìòùÀÈÌÒÙäëïöüÿÄËÏÖÜâêîôûÂÊÎÔÛåÅøØßçÇãñõÃÑÕ';
      $sans =    'aeiouyAEIOUYaeiouAEIOUaeiouyAEIOUaeiouAEIOUaAoOscCanoANO';
      return strtoupper(strtr($txt, $accents, $sans));
    }

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 77
    Points
    77
    Par défaut
    PsychoBob j'ai testé ton code tel que chez moi et il marche parfaitement (ce qui est d'ailleurs logique).
    Es-tu sûr d'avoir bien testé ? Un echo de $post me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo 'resultat : ' . $post . '<br />';
    resultat : Il est content mais plus **** que ****!

Discussions similaires

  1. supprimer les espaces dans un fichier texte
    Par nguim dans le forum Langage
    Réponses: 3
    Dernier message: 10/03/2014, 13h55
  2. Supprimer les apostroohes dans un texte
    Par loudji dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 06/07/2013, 14h29
  3. Supprimer les parenthèses dans un fichier texte
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 16/01/2013, 00h52
  4. Supprimer les doublons dans un fichie texte
    Par VIRGINIE87 dans le forum Langage
    Réponses: 2
    Dernier message: 20/02/2010, 11h01
  5. Supprimer les blancs dans un texte lors de l'ecriture
    Par nypahe dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 10/05/2009, 19h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo