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 :

Se débarraser de certains mots dans une chaine [RegEx]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 55
    Points : 30
    Points
    30
    Par défaut Se débarraser de certains mots dans une chaine
    Bonjour,

    Je me tourne vers vous aujourd'hui pour vous exposer mon problème.
    Je désirerai supprimer des mots comme (le, les, pour, de, des du, à ...) présents dans des chaines que je voudrai alléger (pour un nuage de tags).
    Pour l'instant j'utilise un str_replace qui, vous l'aurez compris, supprime les mots même si ils font partie d'un autre mot, par exemple 'fille' deviendra 'fil'.

    J'ai essayé de créer une regex qui s'occupe de cette tâche mais en vain. Pourriez vous m'aider svp ?

    Un test pour comprendre :
    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
    <?php
     
    $chaine = "Les sauterelles aiment les feuilles"; 
    //Ce que j'utilise maintenant
    $remplace = array('-',' de ', ' des ', 'les ', 'le ', 'la ', ' pour ', 'un ', 'une ', ' d\'', ' l\'', ' avec ','\'');
    $par = array(' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ');
    $chaine1 = str_replace($remplace, $par, $chaine);
    echo $chaine1;
    ?>
    <br />
    <?php
    //ce que j'aimerai faire, mais je test pour l'instant seulement pour 'les' 
    $regex = '|^les|i'; //J'ai aussi testé avec \s seulement je n'arrive pas à combiner les deux
    $chaine2 = preg_replace($regex,' ',$chaine);
    echo $chaine2;
     
    ?>
    Le premier echo donne: Les sauterel aiment feuilles
    Le deuxième echo donne: sauterelles aiment les feuilles
    Mais je veux : sauterelles aiment feuilles

    En fait la regex doit supprimer les mots choisis qui se trouves soit en début, en millieu ou en fin de chaine.

    Quelqu'un a une idée ?

    Merci par avance pour votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    le symbole ^de ton regex indique qu'il s'agit d'un début de chaine... Donc avec ça, les mots au milieu ne seront pas traités.

    Par ailleur, preg_replace peut - tout comme le str_replace - prendre des tableaux en paramètre.

  3. #3
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    tu peux utiliser la condition de limite d'un mot \b :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $chaine = "Les sauterelles aiment les feuilles"; 
    $remplace = array('de', 'des', 'les', 'le', 'la', 'pour', 'un', 'une', 'd', 'l', 'avec','\'');
    $chaine1 = preg_replace('@(\b'.implode('\b|\b', $remplace).'\b)@i',' ',$chaine);
    echo $chaine1;
    ?>

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 55
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par Eusebe Voir le message
    Bonjour,

    tu peux utiliser la condition de limite d'un mot \b :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $chaine = "Les sauterelles aiment les feuilles"; 
    $remplace = array('de', 'des', 'les', 'le', 'la', 'pour', 'un', 'une', 'd', 'l', 'avec','\'');
    $chaine1 = preg_replace('@(\b'.implode('\b|\b', $remplace).'\b)@i',' ',$chaine);
    echo $chaine1;
    ?>
    Merci ca fonctionne comme je le veux. Pourais-tu stp m'expliquer le preg_replace ? Pourquoi le implode ?...

    Comode : Merci de ta réponse

  5. #5
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Bruno.C Voir le message
    Merci ca fonctionne comme je le veux. Pourais-tu stp m'expliquer le preg_replace ? Pourquoi le implode ?...
    Pour tester des alternatives dans une expression régulière, il faut utiliser les parenthèses et le caractère "|". Donc le masque "(de|le)" renverra les occurrences de "de" ou de "le" (même dans un autre mot comme "fille"). Pour indiquer que l'on ne veut que des mots, il faut utiliser la condition de fin de mot \b, soit "(\bde\b|\ble\b)" ou encore "\b(de|la)\b" (ce qui est mieux que ce que j'avais proposé dans mon message). Quand tu as beaucoup de mots à remplacer, plutôt que de créer toi-même la chaîne "de|la|les|des...", on peut utiliser un tableau, et implode pour nous aider à générer le masque, en lui indiquant une "colle" à mettre entre chaque élément du tableau : '\b|\b' dans mon premier exemple, '|' plus simplement dans cette amélioration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $chaine = "Les sauterelles aiment les feuilles"; 
    $remplace = array('de', 'des', 'les', 'le', 'la', 'pour', 'un', 'une', 'd', 'l', 'avec','\'');
    $chaine1 = preg_replace('@\b(' . implode('|', $remplace) . ')\b@i',' ',$chaine);
    echo $chaine1;
    ?>

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 55
    Points : 30
    Points
    30
    Par défaut
    Merci pour ces explications et pour ton aide

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Conserver que certains mots dans une chaine
    Par michaugier dans le forum Langage
    Réponses: 0
    Dernier message: 04/03/2010, 15h58
  3. [Regex]Recherche de mots dans une chaîne
    Par lionel69 dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 17/11/2005, 18h20
  4. recuperer certains temes dans une chaine de caractere
    Par leviathan516 dans le forum ASP
    Réponses: 2
    Dernier message: 15/10/2004, 10h42

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