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 :

regex pour garder seulement les mots 3 lettres et + [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut regex pour garder seulement les mots 3 lettres et +
    Bonjour,
    je peine avec une regex pour "épurer" du texte en ne gardant que les mots de 3 lettres et + (incluant les mots composés).
    Dans un premier temps, j'essaye de ne surligner en HTML que les mots de 3 lettres et + pour déboguer ma regex.
    Voici mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $content = " Bonjour, ceci est un énorme texte ! 12 mot-clés déçu l'orage x-x --- Marie-Antoinette... co-living";
    $words = preg_replace('#(\w{3,})#i', '<font style="background: yellow">$1</font>', $content);
    qui fonctionne en partie mais ne gère pas les accents et les "petits" mots-composés... alors j'ai essayé de rajouter àéèêëîùç sans succès.

    Le but étant de n'avoir plus que :
    Bonjour ceci est énorme texte mot-clés déçu orage Marie-Antoinette co-living
    Une petite aide s'il vous plait...

  2. #2
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Essaie ça.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
     $texte      = " Bonjour, ceci est un énorme texte ! 12 mot-clés déçu l'orage x-x --- Marie-Antoinette... co-living";
     $caracteres = "[a-z0-9àáâãäåçèéêëìíîïðòóôõöùúûüýÿA-ZÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÒÓÔÕÖÙÚÛÜÝŸ\-]";
     $pattern    = "/($caracteres{3,})/m";
     preg_match_all($pattern,$texte,$out);
     var_dump($out);

  3. #3
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Merci pour ton aide badaze
    la regex attrape bien "co-living" mais aussi malheureusement "x-x" et "---"
    et les caractères spéciaux s'affichent �

  4. #4
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Pour les caractères accentués ça doit être dû à l'encodage de ton fichier. Le mien est UTF 8 sans BOM.

    Pour les mots composés tu n'as pas spécifié comment les reconnaître. Informatiquement parlant x-x est équivalent à Marie-Antoinette dans le sens où le compilateur de regexp ne sait pas que x-x n'existe pas et que Marie-Antoinette existe.

  5. #5
    Nb
    Nb est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 151
    Points : 426
    Points
    426
    Par défaut
    Bonjour,
    peut etre un truc dans le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $mot = "[\p{L}']{3,}";
    $motComp = "[\p{L}']{2,}-[\p{L}']{2,}";
    echo preg_replace("#($motComp|$mot)#u", '<bal>$1</bal>', $var);

  6. #6
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Citation Envoyé par badaze Voir le message
    Pour les caractères accentués ça doit être dû à l'encodage de ton fichier. Le mien est UTF 8 sans BOM.
    bien vu !

    Citation Envoyé par badaze Voir le message
    Pour les mots composés tu n'as pas spécifié comment les reconnaître. Informatiquement parlant x-x est équivalent à Marie-Antoinette dans le sens où le compilateur de regexp ne sait pas que x-x n'existe pas et que Marie-Antoinette existe.
    effectivement je n'ai pas précisé... en faite il faudrait que le mot composé ne contienne qu'un seul - et un minimum de 3 lettres avant et/ou après

  7. #7
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Citation Envoyé par Nb Voir le message
    Bonjour,
    peut etre un truc dans le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $mot = "[\p{L}']{3,}";
    $motComp = "[\p{L}']{2,}-[\p{L}']{2,}";
    echo preg_replace("#($motComp|$mot)#u", '<bal>$1</bal>', $var);
    Merci Nb ! bien vu l'astuce...
    \p{L} et \w sont exactement les mêmes choses ???

    je crois que je m'étais bien embêter pour rien avec mes caractères accentués...

    dernière chose : et pour ne garder que le bon (ce qui est surligné) ?

  8. #8
    Nb
    Nb est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 151
    Points : 426
    Points
    426
    Par défaut
    \pL permet de filtrer les caracteres unicodes de type Lettre, ce qui inclue, notaement les caractères accentués.

    Pour supprimer un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    preg_match_all("#($motComp|$mot)#u", $var, $m);
    echo implode (' ', $m[1]);
    ou alors tu fais un masque qui trouve les "mots" que tu ne veux pas et tu les remplaces directement par " " dans un preg_replace.

  9. #9
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    bon je n'arrive pas à faire un masque inverse... pas grave c'était juste pour déboguer.
    Je vais donc utiliser ton dernier code avec preg_match_all et implode

    J'ai essayé sans succès l'optimisation de mon indexation en retirant un ensemble de mots parasites comme des|les|car
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $mot = "[\\p{L}^(des|les|car)]{3,}";
    Un dernier coup de pouce ?

  10. #10
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Une amélioration mais pas sûr que cela suffise.

    Code code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
     $texte      = " Bonjour, ceci est un énorme texte ! 12 mot-clés déçu l'orage x-x --- Marie-Antoinette... co-living  ad--hoc va-y y-va ad-patres";
     $caracteres = "[a-z0-9àáâãäåçèéêëìíîïðòóôõöùúûüýÿA-ZÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÒÓÔÕÖÙÚÛÜÝŸ]";
     $pattern    = "/($caracteres{2,}-$caracteres{3,}|$caracteres{3,}-$caracteres{2,}|(?<!-)$caracteres{3,})/m";
     preg_match_all($pattern,$texte,$out);
     var_dump($out);

    Donne :
    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
     
    [1]=>
      array(11) {
        [0]=>
        string(7) "Bonjour"
        [1]=>
        string(4) "ceci"
        [2]=>
        string(3) "est"
        [3]=>
        string(7) "énorme"
        [4]=>
        string(5) "texte"
        [5]=>
        string(9) "mot-clés"
        [6]=>
        string(6) "déçu"
        [7]=>
        string(5) "orage"
        [8]=>
        string(16) "Marie-Antoinette"
        [9]=>
        string(9) "co-living"
        [10]=>
        string(9) "ad-patres"
      }

  11. #11
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    effectivement badaze... ton amélioration est intéressante. Je ne comprends pas tout mais pas mal !

    Une idée pour exclure les mots parasites tel que : est|des|les|car ?

  12. #12
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Pour les mots parasites, le plus simple est de les remplacer dès le début AMHA.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $texte   = " des fois descartes jouait aux cartes car il aimait ça";$liste   = "(des|car|aux)";
    $pattern = "/\b$liste\b/";
    print "Avant : $texte<br/>";
    $texte2  = preg_replace($pattern,'',$texte);
    print "Après : $texte2<br/>";

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Avant :  des fois descartes jouait aux cartes car il aimait ça
    Après :   fois descartes jouait  cartes  il aimait ça

  13. #13
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    ok je comprends qu'il est parfois préférable de faire en plusieurs étapes.

    Merci à vous !!!
    mon problème est résolu

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 16/01/2011, 16h36
  2. [RegEx] Regex pour supprimer tous les caractères répétés
    Par deadc0de dans le forum Langage
    Réponses: 8
    Dernier message: 25/11/2009, 09h25
  3. récuperer seulement les 2 premières lettre
    Par adriennoob dans le forum VBA Access
    Réponses: 3
    Dernier message: 31/08/2009, 15h37
  4. [RegEx] Garder seulement les sauts de ligne entre deux balises
    Par Adjoint dans le forum Langage
    Réponses: 1
    Dernier message: 26/01/2009, 21h56
  5. Récupérer seulement les mots de plus de 5 lettres
    Par Tee shot dans le forum Langage
    Réponses: 12
    Dernier message: 21/05/2007, 00h01

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