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 :

Crochets d'exclusion [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut Crochets d'exclusion
    Bonjour,

    J'ai des données de ce type (1 ligne représente une donnée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    TEST - TEST
    TEST [TEST1] TEST - TEST
    TEST [TEST2] TEST - TEST
    TEST [TEST3] -- TEST
    TEST [TEST4] TEST
    TEST -- TEST
    TEST [TEST5] TEST - TEST
    TEST [TEST6] TEST
    TEST [TEST7] -- TEST
    TEST [TEST8] TEST
    Je veux détecter les lignes qui sont de type "%[%]%":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $re = "/\\[.*\\]/";
    Mais qui ne contient pas certains termes comme par exemple : TEST4, TEST5 et TEST6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $re = "/\\[TEST4\\]|\\[TEST5\\]|\\[TEST6\\]/";
    C'est là que je bloque car il faut faire commencer la chaine par ^ et je ne sais pas comment faire.

    Voici pour vous aider : https://regex101.com/r/cB7fF6/1

    Merci pour votre aide,
    ZiP

  2. #2
    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
    il faut faire commencer la chaine par ^
    : ah bon?

    Pour détecter une chaîne qui ne soit pas "TEST4" 5 ou 6 entre crochets, tu peux utiliser un test avant négatif (negative lookahead) (?!...) qui signifie "non suivi de" juste après le crochet ouvrant. Les tests avant et arrière comme les ancres ^ $ \A \z sont des éléments qui ne consomment pas de caractères (on les appelles des zero width assertions), par conséquent si le test réussi, le moteur de regex se trouve toujours à la même position, c'est à dire juste après le crochet ouvrant. Ce qui donne:À noter que le crochet fermant n'est pas un caractère spécial et n'a pas besoin d'être échappé. Par contre il doit l'être dans une classe de caractère pour ne pas être confondu avec la fin de la classe de caractère, sauf si celui-ci est placée en première position de la classe ou juste après le caractère de négation ^.

    Maintenant cette pattern se contente de confirmer qu'il existe au moins une pair de crochets ne contenant pas un des "mots interdits", mais pas que la ligne n'en contient pas et qu'elle suit bien le schéma %[%]%. Pour en être sûr, il faut décrire la ligne de bout en bout et ajouter des ancres de début et de fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $re = '/\A[^[]*\[(?!TEST[456]])[^]]*][^[]*\z/'; // si on travaille ligne par ligne
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $re = '/^[^[\n]*\[(?!TEST[456]])[^]\n]*][^[\n]*$/m'; // si toutes les lignes sont dans une même chaîne
    (Il n'est pas utile de doubler les antislashes contrairement à ce que laisse entendre le générateur de code de regex101.)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonsoir,

    Merci pour votre réponse qui est très complète !

    J'ai un peu de mal à comprendre la seconde partie, celle qui complète la vérification.

    J'ai testé ça avec semble-t-il succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \[(?!MOT 1|MOT 2|MOT3|MOT 4])[^]]*]
    Mais cette partie ne semble pas fonctionner chez moi sur regex101.com :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $re = '/\A[^[]*\[(?!TEST[456]])[^]]*][^[]*\z/'; // si on travaille ligne par ligne
    C'est cette partie que j'ai du mal à comprendre.

    Merci,
    ZiP

  4. #4
    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
    J'ai testé ça avec semble-t-il succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \[(?!MOT 1|MOT 2|MOT3|MOT 4])[^]]*]
    Une pattern doit être testée en essayant de la mettre en défaut:
    • elle réussira pour la chaîne:abcd [MOT 1] efgh [autre mot] ijkl
    • elle échouera pour la chaîne abcd [MOT 12] efgh

    Est-ce vraiment ce que tu souhaites?

    Mais cette partie ne semble pas fonctionner chez moi sur regex101.com :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $re = '/\A[^[]*\[(?!TEST[456]])[^]]*][^[]*\z/'; // si on travaille ligne par ligne
    Cette pattern fonctionne très bien si tu lui passes juste une seule ligne (c'est ce que signifie le commentaire).

    C'est cette partie que j'ai du mal à comprendre.
    L'idée de cette pattern comme de la suivante est de décrire un ligne complète, il n'y a rien de difficile dedans d'autant plus que regex101 décrit les éléments un à un.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    Elle ne doit échouer que s'il n'y a pas de "[]" ou si l'intérieur des crochets correspond aux termes listés comme rejetés.

    elle échouera pour la chaîne [codeinline]abcd [MOT 12] efgh
    Je me suis surement mal exprimé.

    Merci,
    ZiP

  6. #6
    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
    Oui et "MOT 12" ne fait pas partie des termes listés, or ta pattern le rejettera.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Merci,
    ZiP

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

Discussions similaires

  1. [Win XP Pro] Lecture exclusive du CD-ROM
    Par Giovanny Temgoua dans le forum Windows XP
    Réponses: 3
    Dernier message: 09/11/2004, 10h26
  2. Archive tar et exclusion de fichiers
    Par aliasjcdenton dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 18/08/2004, 03h09
  3. [WebMacro] Les crochets s'invitent!
    Par Twofy dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 04/08/2004, 13h22
  4. [DBDESIGNER] exclusion lors d'héritage
    Par startout dans le forum DBDesigner
    Réponses: 3
    Dernier message: 09/06/2004, 23h44
  5. Ouverture de la BD en exclusive
    Par ZEUSGR dans le forum Access
    Réponses: 2
    Dernier message: 22/09/2003, 11h15

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