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 :

Problème d'extraction avec preg_match [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Par défaut Problème d'extraction avec preg_match
    Bonjour,

    Je suis bloquer pour la mise en oeuvre d'extraction avec preg_match.

    Dans le cadre de mon travail je doit extraire des données d'un champ pour renseigner d'autre champs.

    Je m'explique:
    Dans un champ nommer désignation on peut trouver par exemple la donnée suivante : PRODUIT NOM 100KG

    Le but est d'extraire le volume du produit, soit 100 dans un nouveau champ, puis ensuite l'unité de volume, ici KG pour renseigner un autre champ.

    De plus la désignation peut être écrite en minuscule et le 100KG peut être séparer d'un espace. Les unités de volume peuvent être aussi KG, ML, G et L

    J'ai réussi à faire un bou de code mais celà ne fonctionne plus quand mon unité de volume présente qu'une seul lettre.

    Voici mon code:
    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
    28
    29
    30
    31
    32
    <?php 
    $designation = "PRODUIT NOM 600KG";
     
    //Vérification et mise en forme de la désignation en majuscule
    $designation = strtoupper($designation);
     
     
    //Recheche du volume
    $input = $designation; 
    if(preg_match('/([0-9]*)ML|([0-9]*) ML|([0-9]*)KG|([0-9]*) KG/', $input, $matches)) { 
     if(isset($matches[1])) { 
     	$volume = $matches[1]; } 
     if(isset($matches[2])) { 
     	$volume = $matches[2]; }
     if(isset($matches[3])) { 
     	$volume = $matches[3]; } 
     if(isset($matches[4])) { 
     	$volume = $matches[4]; } 
    }
     
    if(preg_match('/'.$volume.' ([A-Z]*)|'.$volume.'([A-Z]*)/', $input, $matchesessai)) { 
     if(isset($matchesessai[1])) { 
     $unite = $matchesessai[1]; }
    if(isset($matchesessai[2])) { 
     $unite = $matchesessai[2]; }
    } 
     
     
    ?>
    A- <?php echo $designation; ?></br>
    B- <?php echo $volume; ?></br>
    C- <?php echo $unite; ?></br>
    Ce code fonctionne pour les unités en KG et ML.

    Avec ce code pour une condtion suplémentaire pour une unité de L:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(preg_match('/([0-9]*)ML|([0-9]*) ML|([0-9]*)KG|([0-9]*) KG/|([0-9]*)L|([0-9]*) L/', $input, $matches))
    Celà ne fonctionne plus.


    Merci de votre aide pour m'indiquer si je suis sur la bonne voie ou si pour le moment de rentre dans un mur...

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 205
    Billets dans le blog
    1
    Par défaut
    mmm tu t'es un peu compliqué la vie
    Tu as une option "i" qui permet de rendre ton expression régulière insensible à la casse.
    De même, le caractère "?" permet d'indiquer que tu souhaites le motif précédent 0 ou 1 fois (donc 0 ou 1 espace dans ton cas).
    Enfin, tu peux matcher plusieurs éléments à la fois avec des parenthèses capturantes, en séparant les différents motifs possibles pour tes unités de volumes avec des | (qui représente un OU logique, donc A|B signifie que tu souhaites avoir A ou B).

    Voilà ce que ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php 
    $designation = "PRODUIT NOM 600 ml";
     
    //Recheche du volume
    $input = $designation; 
    if (preg_match('/(?<volume>[0-9]*) ?(?<unite>KG|L|ML|G)/i', $input, $matches)) {
        var_dump($matches);
    }
    ?>
    En bonus : la partie ?<volume> qui permet de nommer directement le motif correspondant à la parenthèse capturante courante, ce qui permet ensuite de manipuler $matches['volume'] au lieu de $matches[1].
    si ce post vous a été utile, si votre problème est résolu.
    Pensez-y !
    __________________________________
    Doc officielle PHP | FAQ PHP | Cours PHP

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Par défaut
    Merci pour ton aide.

    Ma direction ne voulant pas m'envoyer en formation pour mieux connaître et maîtrisé le php on ce débrouille avec les moyens du bord.
    D'habitude j'utilise des exemples sur le web pour adapter le code à mes besoins, mais la sur le preg_match je bloquais

    Merci les forums

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

Discussions similaires

  1. Problème d'extraction de données avec jointure
    Par didier.M dans le forum Développement
    Réponses: 2
    Dernier message: 16/07/2008, 14h28
  2. [RegEx] Problème assez étrange avec un preg_match
    Par lysandre dans le forum Langage
    Réponses: 3
    Dernier message: 28/05/2008, 00h14
  3. [RegEx] problème avec preg_match
    Par thewaterkidny dans le forum Langage
    Réponses: 3
    Dernier message: 24/04/2008, 16h57
  4. [RegEx] problème avec preg_match
    Par othmane126 dans le forum Langage
    Réponses: 1
    Dernier message: 15/10/2007, 15h04
  5. Réponses: 23
    Dernier message: 24/05/2007, 10h32

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