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 permettant de retourner la liste des mots [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2007
    Messages : 108
    Points : 57
    Points
    57
    Par défaut Regex permettant de retourner la liste des mots
    Bonjour,

    Je dois zapper un truc "tout con", mais avec un preg_match_all, je souhaite créer un table qui contient la liste des mots d'une chaîne de caractères en supposant également que plusieurs espaces doivent compter comme un seul !

    Ainsi la chaîne suivante :
    "Voici un texte ou certains mots sont séparés de plusieurs espaces"
    devra me retourner le tableau suivant :
    Array
    (
    [0] => "Voici"
    [1] => "un"
    [2] => "texte"
    [3] => "ou"
    [4] => "certains"
    [5] => "mots"
    [6] => "sont"
    [7] => "séparés"
    [8] => "de"
    [9] => "plusieurs"
    [10] => "espaces"
    )
    Mais j'arrive pas a trouver la bonne regex permettant de faire considérer plusieurs espaces comme un seul

  2. #2
    Membre confirmé
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Points : 451
    Points
    451
    Par défaut
    Hello,
    Tu peux aussi faire les choses en deux étapes:
    réduire les espaces successifs >1 en ' ':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = preg_replace('/\s{2,}/', ' ', $texte);
    cf sujet sur forum
    et ensuite, tu peux faire un explode .
    NB: A mon avis, tu dois pouvoir aussi tout faire directement avec preg_split mais je ne l'ai jamais encore utilisée...
    My daughter, my laptop, my bike and my double-sticks...

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    str_word_count ?

  4. #4
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2007
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Re,

    J'ai utilisé ce bricolage,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $texte="Voici un texte   ou  certains mots sont séparés de plusieurs espaces";
    $out=array_slice(array_unique(explode(" ",$texte)),0);
    c'est pas parfais, convient largement à mon besoin

    Par contre, je pensais (naïvement) pouvoir faire cela proprement avec une regex et un simple preg_match

  5. #5
    Membre confirmé
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Points : 451
    Points
    451
    Par défaut
    Citation Envoyé par elekaj34 Voir le message

    Par contre, je pensais (naïvement) pouvoir faire cela proprement avec une regex et un simple preg_match
    résultat plus propre (sans un resultat avec un chaine vide, comme dans ton code), avec regex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $texte="Voici un texte  ou   certains mots sont séparés de plusieurs espaces";
    $out=preg_split("/[\s]+/", $texte);
    var_dump($out);
    My daughter, my laptop, my bike and my double-sticks...

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $texte="Voici un texte  ou   certains mots sont séparés de plusieurs espaces";
    $out = str_word_count($texte, 1);

  7. #7
    Membre confirmé
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Points : 451
    Points
    451
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $texte="Voici un texte  ou   certains mots sont séparés de plusieurs espaces";
    $out = str_word_count($texte, 1);
    ouai en effet
    marche aussi pour des séparateurs genre ',', '/'... en plus on peut paramétrer le retour... merci stealth (connaissait po )
    My daughter, my laptop, my bike and my double-sticks...

  8. #8
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2007
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    La version avec str_word_count marche .... a peu près (chez moi les accents sont comptés comme séparateur).

    Sinon, la soluce de kalimukti marche au poil

    Merci à vous

  9. #9
    Membre régulier
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 80
    Points
    80
    Par défaut
    Bonjour,

    Je ne connaissais pas non plus str_word_count. J'essaierai

    Par contre, j'utilise preg_split avec un bon paquet de délimiteurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $regex = '#[ ,/\&\"\#\'\{\(\[\-\|\_\\\^\@\)\°\]\=\+\}\$\%\*\<\>\?\;\.\:\!\§]+#Us';
    $words = preg_split($regex, $value, -1, PREG_SPLIT_NO_EMPTY);

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Doc_xhtml Voir le message
    Bonjour,

    Je ne connaissais pas non plus str_word_count. J'essaierai

    Par contre, j'utilise preg_split avec un bon paquet de délimiteurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $regex = '#[ ,/\&\"\#\'\{\(\[\-\|\_\\\^\@\)\°\]\=\+\}\$\%\*\<\>\?\;\.\:\!\§]+#Us';
    $words = preg_split($regex, $value, -1, PREG_SPLIT_NO_EMPTY);
    \b est le délimiteur de mot, suffit de rajouter - et ', et c'est ok

  11. #11
    Membre régulier
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 80
    Points
    80
    Par défaut
    Merci Stealth de ta suggestion

    Effectivement, il y avait plus simple que d'énumérer tous les séparateurs du clavier.
    (Je voulais permettre à l'utilisateur de définir en toute liberté ses propres séparateurs.)

    Je corrigerai mon code en conséquence.

  12. #12
    Membre régulier
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    \b est le délimiteur de mot, suffit de rajouter - et ', et c'est ok
    Bonjour Stealth,

    Il y a peut-être quelque chose que je n'ai pas compris.
    Lorsque j'utilise l'ancienne regex, le code ci-dessous me génère bien la table des mots.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $regex = "#[ ,/\&\"\#\'\{\(\[\-\|\_\\\^\@\)\]\=\+\}\$\%\*\<\>\?\;\.\:\!]+#Us";
    $words = preg_split($regex, $value, -1, PREG_SPLIT_NO_EMPTY);
    Par contre, lorsque je simplifie la regex en utilisant \b,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $regex = "#[\b\-\']+#Us";
    $words = preg_split($regex, $value, -1, PREG_SPLIT_NO_EMPTY);
    $words[0] contient la chaîne $value entière mais la table des mots n'est pas générée.

    Où est l'erreur ?

  13. #13
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Salut,
    c'est dû au fait que tu le mettes entre crochets, du coup le pattern match la 'classe mots'. Par contre, t'auras les espaces considérés comme des mots avec ce pattern.

    (\b est dépendant de l'encoding et str_word_count() de la localisation définie, il vaut mieux définir le pattern sur le split plutôt que sur ce que tu veux conserver)
    Vive les roues en pierre

  14. #14
    Membre régulier
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    c'est dû au fait que tu le mettes entre crochets, du coup le pattern match la 'classe mots'. Par contre, t'auras les espaces considérés comme des mots avec ce pattern.
    Merci de ta réponse, Djakisback.

    J'avoue ne pas bien comprendre. Dans les exemples de preg_split, on trouve des expressions du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_split("/[\sautres_caractères_de_séparation]+/", chaîne)
    En quoi sur le fond le délimiteur \b diffère-t-il du délimiteur \s ? Pourquoi ne peut-on pas le mettre entre crochets ?
    J'ai essayé la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_split("#\b#", chaîne)
    J'obtiens une table contenant les mots, mais aussi les espaces, les délimiteurs tels que / ainsi que les caractères accentués qui sont considérés comme délimiteurs (mais non affichés par print_r).

    Citation Envoyé par Djakisback Voir le message
    (\b est dépendant de l'encoding et str_word_count() de la localisation définie, il vaut mieux définir le pattern sur le split plutôt que sur ce que tu veux conserver)
    Excuse-moi, je n'ai pas vraiment compris ce que tu veux transmettre.

  15. #15
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Finalement, je ne m'explique pas pourquoi \b défini dans une classe via les crochets ne matche pas les délimiteurs de mots. En tout cas avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $out = preg_split("/[\b]/Us", $texte);
    aucun délimiteur n'est matché, donc preg_split() retourne la chaîne complète, de la même manière que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all("/[\b]/Us", $texte, $out);
    ne retourne aucun résultat.

    Au sujet de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_split("#\b#", chaîne)
    c'est ce que je disais à propos de l'encoding. Par défaut, seuls les caractères de la classe [a-zA-Z0-9_] sont considérés comme des caractères de "mot", l'ASCII non étendu en fait, si je ne m'abuse.
    On peut utiliser l'option /u pour analyser les caractères en tant qu'UTF-8.

    Le problème est quasiment le même avec str_word_count() qui lui, analyse les chaînes en fonction de la locale définie, mais qui en plus va bugger si c'est de l'UTF-8 car il ne gère pas le multibytes il me semble.

    Ce que je voulais dire par ma dernière phrase c'est qu'à mon avis utiliser un pattern de ce type (donc comme tu le faisais) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $out = preg_split("/[\s;:,!)(etc.]+/", $texte, null, PREG_SPLIT_NO_EMPTY);
    c'est à dire travailler sur ce qu'on veut splitter et non pas sur la notion de 'mot', me semble beaucoup plus portable si on excepte certaines langues particulières comme le Japonais, etc. Un avis personnel bien sûr

    (une autre soluce serait de forcer l'utf-8 et d'utiliser plutôt match_all afin de ne pas récupérer les espaces et délimiteurs dans le tableau final comme c'est le cas avec $out = preg_split("/\b/Uu", $texte) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all("`\w+?`Uu", $texte, $out);
    )
    Vive les roues en pierre

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    je te déconseille fortement d’utiliser l'opérateur d'exécution (`) pour délimiter tes regex

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

Discussions similaires

  1. Liste des mots français pour application JAVA
    Par elitost dans le forum Général Java
    Réponses: 15
    Dernier message: 16/08/2010, 15h57
  2. Réponses: 1
    Dernier message: 12/10/2006, 16h48
  3. Liste des mots-clefs de MySQL
    Par EvilAngel dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 18/08/2006, 15h32
  4. Liste des mots clés c++
    Par CyberCouf dans le forum C++
    Réponses: 4
    Dernier message: 08/12/2005, 00h13

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