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 :

Répétition d'une chaine de caractères dans un preg_replace [RegEx]


Sujet :

Langage PHP

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Répétition d'une chaine de caractères dans un preg_replace
    Bonjour.

    J'ai écris une fonction pour censurer des mots à partir d'un texte (en les remplaçant un nombre d'étoiles égale à la longueur du mot 'matché').


    J'ai réussi à le faire d'une manière statique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function censure($texte) {
     $badwords = array("#sex#i", "#p(ro|or)n#i");
     $replace = array("***", "****");
     
     $texte = preg_replace($badwords, $replace, $texte);
     
     return $texte;
    }

    Seulement j'aurais préférer trouver une manière dynamique, pour éventuellement interfacer cela avec une BDD.

    Voici ce que j'ai tenté de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function censure($texte) {
     $badwords = array("#(sex)#i", "#(p(ro|or)n)#i");
     
     for ($i = 0; $i < count($badwords); $i++)
       $texte = preg_replace($badwords[$i], str_repeat("*",strlen('$1')), $texte);
     
     return $texte;
    }
    Mais là il me remplace les 'badwords' par seulement deux étoiles. Je me dis alors qu'il n'interprète pas comme il faut le $1. Ceci est probablement dû à l'appel au deux fonction str_repeat() et strlen().

    Voilà! Pour infos, j'ai réussi à coller mon prof d'info avec cette question >.<


    Des idées? :)

  2. #2
    Membre actif Avatar de BlackSmith
    Inscrit en
    Mars 2008
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2008
    Messages : 181
    Points : 207
    Points
    207
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $texte = preg_replace($badwords[$i], str_repeat("*",strlen($badwords[$i])), $texte);
    Tu peut essayer comme ça et en plus c plus simple.

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Le code figurant en deuxième paramètre de la fonction preg_replace sera exécuté avant et non lors de chaque remplacement (ce qui fait, qu'entre autres, vous ne pourrez pas connaître la longueur de la chaîne matchant l'expression). Pour avoir ce premier effet, il faut soit faire appel à la fonction preg_replace_callback, dont le but est d'appeler une fonction (qui vous permettra d'agir sur le remplacement de manière direct ou non) lors de chaque correspondance soit d'utiliser le flag e.

    Ce qui nous donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function my_cb($matches) {
        return str_repeat('*', strlen($matches[0]));
    }
     
    $texte = 'sex is porn';
    $badwords = array("#\bsex\b#i", "#p(?:ro|or)n#i");
    $texte = preg_replace_callback($badwords, 'my_cb', $texte);
    Ou bien, mais un peu plus alambiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $texte = 'sex is porn';
    $texte = preg_replace("#(?:\bsex\b|p(?:ro|or)n)#ie", 'str_repeat("*", strlen("\0"));', $texte);

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci à vous deux pour vos réponses. J'ai utilisé le 1er code proposer par julp, et ça marche impek

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB]Recherche d'une chaine de caractère dans un fichier
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 26
    Dernier message: 16/02/2006, 09h10
  2. Ecriture d'une chaine de caractères dans un fichier
    Par fleur_de_rose dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 09h34
  3. Récupérer une chaine de caractère dans une page
    Par BrunS dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2005, 14h28
  4. [String]Recherche d'une chaine de caractères dans une autre
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 29/07/2004, 11h51
  5. recherche d'une chaine de caractère dans une données text
    Par jdeheul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/06/2004, 16h35

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