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 :

Php et expressions regulières [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 62
    Points : 42
    Points
    42
    Par défaut Php et expressions regulières
    Salut à tous,

    voilà, j'aimerais récupérer des parties d'une chaine via une expression régulière.

    Les délimiteurs sont DA,DB ou DC.
    Pb : on ne sait pas si tout les delimiteur y sont.

    Exemple les chaines (j'ai mis des espaces pour que ce soit plus lisible) :

    DC aaaa DA bbbb DC ggggg DA hhhhh DB iiiiii
    ou
    DC aaaaa DB iiii

    je n'arrive pas à trouver cette putain d'expression !
    (je sais utiliser ereg)

    Je sais que dedans doit y avoir un truc du genre :
    (.*)(DA|DB|DC)(.*) mais je comprends pôôÔÔ...
    -> dans ce cas il me renvoie en
    1er : DC aaaa DA bbbb DC ggggg DA hhhhh DB
    2eme : iiiii
    et j'ai du mal à isoler chaque partie.


    Et de façon générale dans une chaine du type :
    DA aaa DA bbbbbb DA ccccc DA
    comment on récupère juste le aaaa ??

    RUn grand merci !

  2. #2
    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

    Avec ceci, peut-être ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $string = 'DC aaaa DA bbbb DC ggggg DA hhhhh DB iiiiii';
    $array = preg_split('/(?:DA|DB|DC)/', $string);
     
    echo '<pre>';
    print_r($array);
    echo '</pre>';

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 62
    Points : 42
    Points
    42
    Par défaut
    Merci de ta réponse.
    Oui j'avais pensé au split mais comment savoir quelle partie est lié avec tel délimiteur ?

    exemple : DC aaaa DA bbbb DC ggggg DA hhhhh DB iiiiii

    comment savoir que pour aaaa c'est le deliteur DC ?
    comment savoir que pour bbbb c'est le deliteur DA ?

    etc...
    merci.

  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
    Là, désolé, je ne pane vraiment rien à ton problème.

    Sinon, tu as une autre solution (dans mon état de fatigue, je ne peux pas mieux faire mais peut-être demain) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $string = 'DC aaaa DA bbbb DC ggggg DA hhhhh DB iiiiii';
    preg_match_all('/DA(.*?)(?:DB|DC)/', $string, $matches_da);
    preg_match_all('/DB(.*?)(?:DA|DC)/', $string, $matches_db);
    preg_match_all('/DC(.*?)(?:DA|DB)/', $string, $matches_dc);
     
    echo '<pre>';
    echo '<font color="blue">DA</font><br />';
    print_r($matches_da);
    echo '<br /><br /><br /><font color="blue">DB</font><br />';
    print_r($matches_db);
    echo '<br /><br /><br /><font color="blue">DC</font><br />';
    print_r($matches_dc);
    echo '</pre>';
    Là, il ne va pas trouver iiiitruc car il lui manque un délimiteur de fin... Teste sa présence et ajoute-le si besoin.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 62
    Points : 42
    Points
    42
    Par défaut
    Oui excuse moi c pas très clair , voilà mon pb reformulé:

    En fait je peux avoir plusieurs delimiteur ex:
    TITRE AUTEUR PRIX EDITEUR
    donc je peux avoir:

    TITRE les expressions régulières c'est caca AUTEUR Guano PRIX 20€ EDITEUR Prise de tête & Co

    (y'a pas d'espace normalement)

    mais également :
    TITRE les expressions régulières c'est caca PRIX 20€


    et je veux juste récupérer les infos en savant à quoi ca correspond...

  6. #6
    Membre habitué Avatar de ciesco
    Inscrit en
    Février 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 110
    Points : 127
    Points
    127
    Par défaut
    Moi moi!
    Je tente...
    Je dirais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $string = 'DC aaaa DA bbbb DC ggggg DA hhhhh DB iiiiii'; 
    preg_match_all('!D[ABC](.*)D[ABC]!U', $string, $matches);

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 62
    Points : 42
    Points
    42
    Par défaut
    Puré c'est tout con mais j'y arrive pô...

    j'aimerais comprendre un truc voila une chaine :

    TRUCtotoTRUCtitiTRUCtataTRUC

    quand je fais comme exp reg :

    (.*)(TRUC) ça me renvoie : totoTRUCtitiTRUCtata
    et en fait je voudrais juste toto, puis après je me démerde pour avoir le reste.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 109
    Points : 131
    Points
    131
    Par défaut
    Citation Envoyé par guano
    Puré c'est tout con mais j'y arrive pô...

    j'aimerais comprendre un truc voila une chaine :

    TRUCtotoTRUCtitiTRUCtataTRUC

    quand je fais comme exp reg :

    (.*)(TRUC) ça me renvoie : totoTRUCtitiTRUCtata
    et en fait je voudrais juste toto, puis après je me démerde pour avoir le reste.
    Pour ca tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $texte="totoTRUCtitiTRUCtata"; 
     
    $chaine = explode("TRUC", $texte); 
    echo $chaine [0]; // donne "toto" 
    echo $chaine [1]; // donne "titi"
    etc ...
    avec un foreach $index => $chaine tu recupere tout.

  9. #9
    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
    Sérieusement, as-tu essayé le code que je t'ai donné ci-dessus ? Ne te convient-il pas ?

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par guano
    Oui excuse moi c pas très clair , voilà mon pb reformulé:

    En fait je peux avoir plusieurs delimiteur ex:
    TITRE AUTEUR PRIX EDITEUR
    donc je peux avoir:

    TITRE les expressions régulières c'est caca AUTEUR Guano PRIX 20€ EDITEUR Prise de tête & Co

    (y'a pas d'espace normalement)

    mais également :
    TITRE les expressions régulières c'est caca PRIX 20€

    et je veux juste récupérer les infos en savant à quoi ca correspond...
    Kirkis t'a mis sur la voie plus haut. Tu peux utiliser preg_split avec l'option PREG_SPLIT_DELIM_CAPTURE qui te capturera également les délimiteurs. Après, c'est un simple exercice de manip de tableaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $txt = "TITREles expressions régulières c'est génialAUTEURGuanoPRIX 20€ EDITEURPrise de tête & Co";
     
    $split = preg_split('#(TITRE|AUTEUR|PRIX|EDITEUR)#', $txt, -1, PREG_SPLIT_DELIM_CAPTURE);
     
    $iMax = count($split);
    for ($i = 1; $i < $iMax; $i += 2 ){
      $resultat[$split[$i]] = $split[$i+1];
    }
    echo '<pre>'; print_r($resultat); echo '</pre>';

  11. #11
    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
    ripat : Merci pour ton soutien, cependant ta solution ne convient pas car notre ami souhaite savoir ce qui a été délimité ainsi que par quoi ça a été délimité, or ton expression splitte aveuglément :/

    Dans cette profusion d'exemples, je répète ma proposition qui fonctionne :
    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
    $string = 'TITRE les expressions régulières c\'est caca AUTEUR Guano PRIX 20€ EDITEUR Prise de tête & Co END';
    preg_match_all('/TITRE(.*?)(?:AUTEUR|PRIX|EDITEUR|END)/', $string, $matches_titre);
    preg_match_all('/AUTEUR(.*?)(?:TITRE|PRIX|EDITEUR|END)/', $string, $matches_auteur);
    preg_match_all('/PRIX(.*?)(?:TITRE|AUTEUR|EDITEUR|END)/', $string, $matches_prix);
    preg_match_all('/EDITEUR(.*?)(?:TITRE|AUTEUR|PRIX|END)/', $string, $matches_editeur);
     
    echo '<pre>';
     
    echo '<font color="blue">TITRE</font><br />';
    print_r($matches_titre);
     
    echo '<br /><br /><br /><font color="blue">AUTEUR</font><br />';
    print_r($matches_auteur);
     
    echo '<br /><br /><br /><font color="blue">PRIX</font><br />';
    print_r($matches_prix);
     
    echo '<br /><br /><br /><font color="blue">EDITEUR</font><br />';
    print_r($matches_editeur);
     
    echo '</pre>';
    Note que la seule contrainte est l'ajout d'un délimiteur bidon à la fin de la chaîne : END.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par Kirkis
    ... notre ami souhaite savoir ce qui a été délimité ainsi que par quoi ça a été délimité
    Ben oui, c'est exactement ce que fait mon snippet il me semble.

    Essaye-le.

  13. #13
    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
    Arf...
    Comme quoi on devrait toujours suivre ses propres conseils (en l'occurence tester un extrait de code avant d'en médire).
    Ta proposition me semble parfaite, plus simple que la mienne, pas contraignante, nickel quoi. Désolé.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 62
    Points : 42
    Points
    42
    Par défaut
    Merci !!!!!!!!!!!!



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

Discussions similaires

  1. Expression regulière en php
    Par val347 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 23/05/2014, 11h09
  2. htacess expression regulière/php
    Par omelhor dans le forum Langage
    Réponses: 1
    Dernier message: 28/09/2012, 09h33
  3. Réponses: 5
    Dernier message: 18/01/2010, 10h13
  4. expression regulière php pour débutant
    Par durthu dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2008, 07h37
  5. Variables et Expression Regulière
    Par Temari dans le forum Langage
    Réponses: 5
    Dernier message: 05/08/2005, 01h55

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