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 :

Besoin d'aide pour un regex précis multiconditions (critère & critère & critère) [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Par défaut Besoin d'aide pour un regex précis multiconditions (critère & critère & critère)
    Bonjour à tous.

    Voilà j'ai essayé de chercher un peu partout comment comprendre les REGEX, mais chaque fois ça reste trop vague pour moi.

    En fait, mon but est de pouvoir extraire des valeurs (coordonnées & tailles) via un REGEX en partant de cette chaine de caractère : [0.23,0.08,0.14x0.04]

    J'ai besoin de 2 extractions :
    1/ j'ai besoin d'extraire 0.23 & 0.08 (qui correspondent à X & Y)
    2/ j'ai besoin d'extraire 0.14 & 0.04 (qui correspondent à Width & height)

    A vrai dire, ca n'est pas vraiment grave si "tailles" et "coordonnées" ne sont pas séparées.
    L'idéal pour moi serait de récupérer dans un tableau les 4 valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $coord = [0.23,0.08,0.14x0.04]
     
    $tab[0] = 0.23
    $tab[1] = 0.08
    $tab[2] = 0.14
    $tab[3] = 0.04
    J'ai donc pensé à simplement faire un preg_match_all
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $split = preg_match_all("/,(.*)/",$coord,$tab, PREG_PATTERN_ORDER);
    Sauf qu'avec mon REG actuel, il ne me ressort que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $tab[0] = 0.08
    $tab[1] = 0.14x0.04
    Normal, j'ai bien conscience que je ne lui demande que de récupérer ce qui se trouve après une ","

    Donc comment lui dire : récupère moi :
    - la première valeur avant la virgule
    - ET la valeur située entre 2 virgules
    - ET la valeur avant le "x"
    - ET la valeur après le "x"

    En gros, un regex multi conditions.
    Je n'ai trouvé que le "|" qui fait office de "OR", ce qui n'est pas pour correspondre avec ce que je cherche.

    Merci de votre aide.

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    pas besoin de regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $coord = '[0.23,0.08,0.14x0.04]';
    $tab   = explode(',', str_replace(['[', ']', 'x'], ['', '', ','], $coord));

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Effectivement tu peux te passer de regex dans ce cas, en utilisant une chaîne formatée par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tab = sscanf($coord, "[%f,%f,%fx%f]");
    Maintenant pour le faire avec des regex (ce qui est plus fastidieux ici), plusieurs approches sont possibles:
    1. soit tu fais une recherche multiple avec preg_match_all.
    2. soit tu fais une recherche unique en décrivant toute la chaîne avec preg_match et en sélectionnant ce qui t'intéresse avec des groupes de capture.
    3. soit tu découpes avec preg_split.


    D'une manière générale évite d'utiliser .* et appuie toi sur les classes de caractères.

    méthode 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (preg_match_all('~[0-9]+\.[0-9]+~', $coord, $matches))
        $tab = $matches[0];
    ou carrément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (preg_match_all('~[0-9.]+~', $coord, $matches))
        $tab = $matches[0];
    méthode 2: on utilise des groupes de capture et on peut même rajouter les ancres de début et de fin de chaîne (\A et \z) pour être plus précis voire plus efficace:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (preg_match('~\A\[([0-9.]+),([0-9.]+),([0-9.]+)x([0-9.]+)]\z~', $coord, $m))
        $tab = [$m[1], $m[2], $m[3], $m[4]];
    méthode 3: on découpe la chaîne avec tout ce qui entoure les nombres ( les caractères: ] [ , x ) et on évite les éléments vides avec PREG_SPLIT_NO_EMPTY:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tab = preg_split('~[][,x]~', $coord, -1, PREG_SPLIT_NO_EMPTY);
    NB: Parmi ces trois méthodes, seule la méthode 2 garantie que la chaîne est conforme tout en extrayant les nombres.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Par défaut
    Merci beaucoup pour vos réponses

    J'étais certain que le REGEX allait me sauver, mais finalement, y'a beaucoup plus simple

    Je tenterai tout ça demain, après une bonne nuit de semaine avant de fermer définitivement le topic (au cas où.... )

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Par défaut
    J'ai donc testé, c'est parfait

    j'ai opté pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $tab = sscanf($coord, "[%f,%f,%fx%f]");
    Simple net, efficace pour ce que j'avais besoin ici

    Mais du coup je note aussi les autres possibilités qui pourront être adaptées à d'autres cas.

    Merci beaucoup à vous 2 !

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

Discussions similaires

  1. [RegEx] Besoin d'aide pour construire une regex complexe
    Par Predax dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2013, 08h52
  2. [RegEx] Besoin d'aide pour une regex (html)
    Par benjamin122 dans le forum Langage
    Réponses: 10
    Dernier message: 07/09/2012, 23h33
  3. Besoin d'aide pour écrire une regex
    Par kao98 dans le forum Général Python
    Réponses: 4
    Dernier message: 05/03/2010, 15h59
  4. Besoin d'aide pour un regex
    Par chris81 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/09/2008, 14h02
  5. [RegEx] Besoin d'aide pour une regex
    Par vallica dans le forum Langage
    Réponses: 3
    Dernier message: 20/09/2006, 08h50

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