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 :

Trouver le dernier élément [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Points : 73
    Points
    73
    Par défaut Trouver le dernier élément
    Bonjour a tous,

    Une chaine de caractères est constituée de trois élements separés par des underscores:
    - le premier (lettres et chiffres)
    - le milieu (lettre, chiffre et underscore)
    - le dernier (lettres et chiffres)

    Le dernier element est optionel.

    Note : je dois pouvoir acceder a mes groupes par leur nom et non pas par leur index.

    Exemples :

    Chaine : abc_def
    premier : abc
    milieu : def
    dernier : inexistant

    Chaine : abc_def_xyz
    premier : abc
    milieu: def
    dernier: xyz

    Chaine : abc_def_ghi_jkl_xyz
    premier : abc
    milieu : def_ghi_jkl
    dernier : xyz


    Je n'arrive pas écrire d'expression regulière permettant de matcher mes chaines... Je suis parti sur deux pistes :

    Groupe optionel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (?P<premier>[a-z]+)_(?P<milieu>\w+)(_(?P<dernier>[a-z]+))?
    Mais le second groupe matche jusqu'a la fin de la chaine :

    Chaine : abc_def_ghi_jkl_xyz
    premier : abc
    milieu : def_ghi_jkl_xyz
    dernier : vide


    La seconde piste est l'utilisation du '|' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (?P<premier>[a-z]+)_(?P<milieu>\w+)_(?P<dernier>[a-z]+)|(?P<premier>[a-z]+)_(?P<milieu>\w+)
    Cette expression est invalide : les groupes premier et milieu sont déclarés deux fois. Je pensais alors pouvoir ecrire une expression qui réutilise les groupes matchés dans la première partie de l'expression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (?P<premier>[a-z]+)_(?P<milieu>\w+)_(?P<dernier>[a-z]+)|(?P=premier)_(?P=milieu)
    L'expression est valide, mais refuse de matcher les chaines avec juste un premier et un milieu comme abc_def.

    Avez-vous une idée pour resoudre mon problème ? Merci beaucoup !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta définition est imprécise:
    peut être lu comme
    abc_def et ghi_jkl_xyz
    ou
    abc_def_ghi et jkl_xyz

    Sinon il faut définir ton expression comme Ungreedy car effectivement sinon la chaine la plus longue possible te sera retournée.

    Une manière plus simple serait de découper avec explode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $tblPos = array(1=>"premier", 2=>"milieu", 3=>"dernier");
    $chaine = "abc_def_ghi_jkl_xyz";
    $chaine = explode("_",$chaine);
    $i = 0;
    $seg = 0;
    foreach($chaine as $maillon) {
       $i++;
       if ($i == 4) { $i = 1; $seg++; }
       $decoupage[$seg][$tblPos[$i]] = $maillon;
     }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Points : 73
    Points
    73
    Par défaut
    Merci pour la reponse. Apres discussion sur stackoverflow, on a trouve une solution qui fonctionne bien : http://stackoverflow.com/questions/3...lar-expression

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 644
    Points : 66 671
    Points
    66 671
    Billets dans le blog
    1
    Par défaut
    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
     
    $reg="~(?P<debut>^[^_]+)_(((?P<milieu>[a-z_]+)_)|([a-z_]+)_)?(?P<fin>[^_]+)$~";
     
    $chaine="abc_def";
    preg_match($reg,$chaine,$matches);
    extract($matches);
     
    echo "chaine : ".$matches[0]."<br/>debut: ".$debut."<br/>milieu: ".$milieu."<br/>fin: ".$fin;
    echo "<hr>";
     
    $chaine="abc_def_jhi";
    preg_match($reg,$chaine,$matches);
    extract($matches,EXTR_OVERWRITE);
    echo "chaine : ".$matches[0]."<br/>debut: ".$debut."<br/>milieu: ".$milieu."<br/>fin: ".$fin;
    echo "<hr>";
     
    $chaine="abc_def_ghi_jkl_xyz";
    preg_match($reg,$chaine,$matches);
    extract($matches,EXTR_OVERWRITE);
    echo "chaine : ".$matches[0]."<br/>debut: ".$debut."<br/>milieu: ".$milieu."<br/>fin: ".$fin;
    J'ai visité le lien après ...
    ça se vaut ..

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/07/2010, 16h26
  2. for-each et dernier élément
    Par neptune dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/09/2005, 15h53
  3. Comment récupérer l'index du dernier élément inséré ?
    Par Didier100 dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/07/2004, 23h41
  4. Réponses: 2
    Dernier message: 11/08/2003, 10h43
  5. Trouver le dernier enregistrement d'une table
    Par remi59 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/03/2003, 15h54

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