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 :

Création d'une Regex d'exclusion


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de Phiss
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2005
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 676
    Points : 616
    Points
    616
    Par défaut Création d'une Regex d'exclusion
    Bonjour,

    Je suis un peu perdu dans ma regex.

    Je souhaite rechercher toutes les chaines contenues entre deux crochets sauf si ces crochets sont eux mêmes compris entre deux guillemets.
    j'ai bien la première partie mais je ne vois pas comment faire pour exclure des mes résultats les chaines comprises entre guillemets.

    Exemple :

    chaine : [abc]"[def]"ghi[jkl]
    je souhaite récupérer un tableau du style
    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
     
    Array
    (
    0=>
    Array
    (
        [0] => [abc]
        [1] => [jkl]
    ),
    [1] =>
    Array
    (
        [0] => abc
        [1] => jkl
    )
    pouvez vous m'orienter?

    Merci.
    " L'absence diminue les médiocres passions et augmente les grandes, comme le vent éteint les bougies et allume le feu. "
    La Rochefoucauld

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 30
    Points
    30
    Par défaut
    Bonjour, je suis pas un pro dans les expression régulier met pour te dépanner j'ai fais un bout de code, certe pas optimiser met fonctionnel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( preg_match_all("/(?:\"\[\w+\]\"|\[(\w+)\])/", '[abc]"[def]"ghi[jkl][abc]"[def]"ghi[jkl]', $match) ) {
        $array = array_filter( $match[1]);
        print_r($array);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Array
    (
        [0] => abc
        [2] => jkl
        [3] => abc
        [5] => jkl
    )

  4. #4
    Membre confirmé Avatar de Phiss
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2005
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 676
    Points : 616
    Points
    616
    Par défaut
    Merci à tous les deux.

    Bovino, je vais regarder de plus près les assertions.

    Funnyz, je viens d'essayer ta regex mais cela ne marche pas comme je le veux.
    " L'absence diminue les médiocres passions et augmente les grandes, comme le vent éteint les bougies et allume le feu. "
    La Rochefoucauld

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 30
    Points
    30
    Par défaut
    C'est quoi le soucis ? tu voudrais que sa marche comment ?

  6. #6
    Membre confirmé Avatar de Phiss
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2005
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 676
    Points : 616
    Points
    616
    Par défaut
    Funnyz,
    voici ce que je voudrais.

    j'ai une chaine de ce style là en entrée et je voudrais remplacer toutes les valeurs entre crochets qui ne sont pas entre guillemets par d'autre valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [abc] - [defghi_jkl, 2] [mnop] [qrst_uvw_xyz] "test de chaine [entre crochet] puis à la suite \" chaine dans chaine \" fin chaine" {[abc]-3#1} "autre chaine \" dans la seconde chaine avec des caractère accentués  \""
    et je voudrais avoir en sortie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [0] - [1] [2] [3] "test de chaine [entre crochet] puis à la suite \" chaine dans chaine \" fin chaine" {[4]-3#1} "autre chaine \" dans la seconde chaine avec des caractère accentués  \""
    Ta regex ne me retourne pas que les valeurs de chaine entre crochets qui ne sont pas entre guillemets mais toutes les valeurs entre crochets.
    " L'absence diminue les médiocres passions et augmente les grandes, comme le vent éteint les bougies et allume le feu. "
    La Rochefoucauld

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Bonjour,

    l'idée est de court-circuiter le problème posé par les doubles quotes avec une pattern qui reconnait tous les éléments de la chaîne de départ et qui "matche" les passages entre double quotes en priorité. Ainsi, les passages entre crochets "matchés" ne peuvent pas s'y trouver.
    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
    $str = <<<LOD
    [abc] - [defghi_jkl, 2] [mnop] [qrst_uvw_xyz] "test de chaine [entre crochet] puis à la suite \" chaine dans chaine \" fin chaine" {[abc]-3#1} "autre chaine \" dans la seconde chaine avec des caractère accentués  \""
    LOD;
    $pattern='/(?:(?<!\\\)"(?:[^"]|(?<=\\\)")*") # les passages entre doubles quotes
              |(?:\[([^\]]*)]) # ou les crochets qui nous intéressent
              |(?:[^\["]+) # ou le reste
              /x';
    //////////////////////////////////////////
    // pour juste récupérer les valeurs
    //////////////////////////////////////////
    preg_match_all($pattern, $str, $match);
    $result = array_values(array_filter($match[1]));
    print_r($result);
     
    //////////////////////////////////////////
    // pour les modifier
    //////////////////////////////////////////
    function modif($matches) {
        if (isset($matches[1])) return "#meuh!!#"; else return $matches[0];
    }
    $result = preg_replace_callback($pattern, "modif", $str);
    print_r($result);
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [RegEx] Difficulté à la création d'une regex
    Par Zoners dans le forum Langage
    Réponses: 10
    Dernier message: 15/07/2014, 22h48
  2. [RegEx] Exclusions de groupes dans une regex
    Par Papy214 dans le forum Langage
    Réponses: 2
    Dernier message: 20/09/2011, 16h03
  3. Création d'une Regex (TextBox Float)
    Par snakzbenjy dans le forum Silverlight
    Réponses: 2
    Dernier message: 13/04/2011, 20h07
  4. Réponses: 8
    Dernier message: 08/04/2010, 13h45
  5. [BES] Création d'une variable d'environnement
    Par NGI80 dans le forum Autres
    Réponses: 2
    Dernier message: 17/10/2002, 07h31

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