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 :

[Tableaux] expression régulière, séparer les mot d'une chaîne [FAQ]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut [Tableaux] expression régulière, séparer les mot d'une chaîne
    Salut

    J'ai des chaîne de ce genre là : CeciEstUnTest , pas d'espace, ni de caractères accentués

    Je souhaiterais récupérer chacun des mots de cette chaîne dans un tableau (avec la fonction ereg par exemple).

    Dans le cas présent je devrais donc obtenir

    Array
    (
    [0] => CeciEstUnTest
    [1] => Ceci
    [2] => est
    [3] => Un
    [4] => Test
    )

    Le problème : je n'y arrive pas

    Les mot de la chaîne correspondent, si je ne dit pas de bêtise, au patern suivant :
    ([A-Z]{1}[a-z]*), jusque là c'est bon. Mais ensuite, je n'arrive pas obtenir ce que je veux, j'ai soit le premier mot, soit le dernier, soit le premier et le dernier. Mais jamais ceux qui sont entre.

    Est-ce que quelqu'un peux m'aider ?

  2. #2
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Et avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("#([A-Z][a-z]*)+#si",$tachaine,$split);

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Non, avec ça j'obtiens :

    Array
    (
    [0] => CeciEstUnTest
    [1] => CeciEstUnTest
    )

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Kerod, tu as mis le modificateur "i" donc tes majuscules sont bien inutiles

    JuTs, ton {1} est fondamentalement inutile
    Essaie avec :

  5. #5
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Ah oui c'est vrai, désolé pour cet oubli

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par Yogui
    Salut
    JuTs, ton {1} est fondamentalement inutile
    en effet

    Citation Envoyé par Yogui
    Salut
    Essaie avec :
    j'obtiens

    Array
    (
    [0] => CeciEstUnTest
    [1] => Test
    )


  7. #7
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 874
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 874
    Points : 16 272
    Points
    16 272
    Par défaut
    Ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $var = "CeciEstUnTest";
    ereg("([A-Z][a-z]*)([A-Z][a-z]*)([A-Z][a-z]*)([A-Z][a-z]*)",$var,$test);
    print_r($test);
    Mais évidemment, qu'avec cette chaîne précise .. Maintenant il faut arriver à simplifier cette expression et la généraliser.

  8. #8
    Membre éclairé
    Avatar de kankrelune
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 763
    Points : 858
    Points
    858
    Par défaut
    Uhm... pourquoi ne pas utiliser preg_split plutot que preg_match(_all?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
     
    $subject = 'CeciEstUnTest';
     
    $matches = preg_split('~([A-Z][a-z]*)~',$subject,-1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
     
    echo '<pre>'.print_r($matches,true).'</pre>';
     
    ?>
    @ tchaOo°

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Pas de raison particulière, j'était parti sur un ereg, puis preg_match.
    Donc ta solution me convient parfaitement, merci

  10. #10
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Oui, je suis donc à la ramasse, je sais pas pourquoi j'ai compliqué à ce point...

    Bref, pour retomber sur mes pattes, voici la solution que tu cherchais et qui ne te complique pas la vie à utiliser une fonction qui, sémantiquement, est relativement limite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    $string = 'CeciEstUnTest';
    if(preg_match_all('/([A-Z][a-z]*)/', $string, $matches))
    {
        echo '<pre>';
        print_r($matches);
        echo '</pre>';
    }
    exit;
     
    ?>

  11. #11
    Membre éclairé
    Avatar de kankrelune
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 763
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Yogui
    qui ne te complique pas la vie à utiliser une fonction qui, sémantiquement, est relativement limite
    Je vois pas ce qu'il y a de sémantiquement limite dans preg_split... .. .

    Après l'important c'est le résultat et les deux reviennent au même... .. .

    @ tchaOo°

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Dans un cas, tu cherches les mots ; dans l'autre, tu sépares la chaîne en mots tout en modifiant le comportement normal de la fonction de manière à ce que le séparateur ne soit pas oublié. Je vois une légère différence dans la complexité de l'explication

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Bon j'utiliserai preg_split si je ne trouve pas d'autre solution.

    Mais je ne comprends pas pourquoi

    ([A-Z][a-z]*)+ ou même ([A-Z][a-z]*){4} ne fonctionne pas alors que ([A-Z][a-z]*)([A-Z][a-z]*)([A-Z][a-z]*)([A-Z][a-z]*) fonctionne. Pourtant les les deux sont (presque) équivalentes, non ?

  14. #14
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Ceci (cf. plus haut) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
     
    $string = 'CeciEstUnTest';
    if(preg_match_all('/([A-Z][a-z]*)/', $string, $matches))
    {
        echo '<pre>';
        print_r($matches);
        echo '</pre>';
    }
     
    ?>
    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
    27
    X-Powered-By: PHP/5.1.4
    Set-Cookie: DBGSESSID=0597637990000025@clienthost:7869;path=/;
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Content-type: text/html
     
    <pre>Array
    (
        [0] => Array
            (
                [0] => Ceci
                [1] => Est
                [2] => Un
                [3] => Test
            )
     
        [1] => Array
            (
                [0] => Ceci
                [1] => Est
                [2] => Un
                [3] => Test
            )
     
    )
    </pre>

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Ooops, désolé Yogui je n'avais pas vu ton message

    Re- merci, donc

  16. #16
    Membre éclairé
    Avatar de kankrelune
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 763
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Yogui
    Dans un cas, tu cherches les mots ; dans l'autre, tu sépares la chaîne en mots tout en modifiant le comportement normal de la fonction de manière à ce que le séparateur ne soit pas oublié. Je vois une légère différence dans la complexité de l'explication
    Je ne suis pas d'accord... mais c'est une question de point de vue... .. .

    @ tchaOo°

    ps : à aucun moment le comportement de preg_split n'est modifié... ça fait partie des options de la fonction de renvoyer, ou non, les délimiteurs du masque... .. .

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/12/2013, 12h37
  2. séparer les mots d'une phrase
    Par ritchy99 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/01/2013, 00h02
  3. [À télécharger] Comment extraire les mots d'une chaîne ?
    Par pottiez dans le forum Téléchargez
    Réponses: 0
    Dernier message: 09/11/2010, 17h38
  4. [RegEx] Trouver tous les "/mot" dans une chaîne
    Par micatmidog dans le forum Langage
    Réponses: 7
    Dernier message: 31/03/2006, 12h07

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