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 :

Exclusion de certaines chaînes de caractères [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2011
    Messages : 34
    Points : 19
    Points
    19
    Par défaut Exclusion de certaines chaînes de caractères
    Bonjour,

    mon problème est le suivant:
    J'ai une chaîne de caractère qui ressemble à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <ns0:erreur>
                <ns1:code blabla>000</ns1:code>
    </ns0:erreur>
    Et j'aimerais avoir une Regex qui accepte une chaîne de ce type avec n'importe quoi inséré dans la balise "code" sauf les valeurs "000" et "010".
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <ns0:erreur>
                <ns1:code blabla>000</ns1:code>
    </ns0:erreur>
    serait refusé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <ns0:erreur>
                <ns1:code blabla>005</ns1:code>
    </ns0:erreur>
    serait accepté

    La REGEX que j'ai imaginé se constitue comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?s).*<ns0:erreur>(?s).*<ns1:code.*>(?!(010|000)).*</ns1:code>.*
    Sauf qu'elle refuse toute valeur possédant au moins une fois "000" ou "010" .

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <ns0:erreur>
                <ns1:code blabla>000548</ns1:code>
    </ns0:erreur>
    est refusé alors que j'aimerais qu'elle soit acceptée.
    Pourriez-vous m'aidez?
    Merci d'avance (en espérant que j'ai été à peu près clair dans ma question ^^)

  2. #2
    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 637
    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 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Teste ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ns1:code blabla>(?:(?!(00(0|1))))|(00(0|1).+)</ns1:code>
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2011
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    Bonjour SpaceFrog et merci d'avoir répondu,

    La regex que tu m'a envoyé ne correspond malheureusement pas à mes besoins.
    Elle doit pouvoir refuser les codes 000 et 010 tout en laissant passer tout les autres, qu'ils aient ou non le même nombre de chiffres.
    Ce n'est pas le cas ici, car elle laisse passer le code 010 et autre code commençant par la séquence "010" et "000".
    ex: 010 passe, 0005 ne passe pas, 02300012 ne passe pas ...

    Si je prend la regex suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ns1:code blabla>(?:(?!(0(0|1)0)))|(00(0|1).+)</ns1:code>
    avec le premier (0|1) changé de position, la séquence 010 ne passe pas mais cela ne résout pas l'autre problème.

  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
    Le problème est que ton test avant négatif n'est pas assez contraignant. Si tu veux interdire 000 ou 010, et uniquement ces deux valeurs, tu dois indiquer dans le test avant par quoi ces chaînes se terminent, c'est à dire, la balise de fermeture:
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    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 637
    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 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Tu as a priori un souci de mise d'implémentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $chaine1='<ns1:code blabla>000</ns1:code>';
    $chaine2='<ns1:code blabla>0005</ns1:code>';
    $chaine3='<ns1:code blabla>001</ns1:code>';
    $chaine4='<ns1:code blabla>0015</ns1:code>';
     
    $reg='~<ns1:code blabla>(?!(?:(00(0|1))))|(00(0|1).+)</ns1:code>~';
     
    echo (preg_match($reg,$chaine1)?"OK":"KO") ."<br/>";
    echo (preg_match($reg,$chaine2)?"OK":"KO") ."<br/>";
    echo (preg_match($reg,$chaine3)?"OK":"KO") ."<br/>";
    echo (preg_match($reg,$chaine4)?"OK":"KO") ."<br/>";
    ou alors je n'ai pas compris ton besoin ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    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 637
    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 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    mhhhh... pas tout a fait au point il y a en effet des cas de figure qui ne passent pas ...
    cette version me parait plus sûre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $chaine1='<ns1:code blabla>000</ns1:code>';
    $chaine2='<ns1:code blabla>0005</ns1:code>';
    $chaine3='<ns1:code blabla>001</ns1:code>';
    $chaine4='<ns1:code blabla>0015</ns1:code>';
     
    $reg='~<ns1:code blabla>(?!(?:(00(0|1)))<).*</ns1:code>~';
     
    echo (preg_match($reg,$chaine1)?"OK":"KO") ."<br/>";
    echo (preg_match($reg,$chaine2)?"OK":"KO") ."<br/>";
    echo (preg_match($reg,$chaine3)?"OK":"KO") ."<br/>";
    echo (preg_match($reg,$chaine4)?"OK":"KO") ."<br/>";

    [edit]
    ce qui rejoint la propositIon de SpaceSaussage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '~<ns1:code blabla>(?!(?:(00[01]))<).*</ns1:code>~';
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2011
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    J'ai pu tester les versions de CosmoKnacki et de SpaceFrog et les deux fonctionnent parfaitement. Merci à vous deux pour votre aide

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

Discussions similaires

  1. [AC-2010] Requête qui ne prend pas en compte certaines chaînes de caractères
    Par LUCAS-28 dans le forum Access
    Réponses: 3
    Dernier message: 19/03/2014, 12h22
  2. [MySQL] concaténation chaîne de caractères : exclusion de certains caractères
    Par johnlito dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 04/01/2012, 15h41
  3. Réponses: 7
    Dernier message: 30/06/2011, 00h40
  4. Insérer une certaine chaîne de caractères dans MySQL
    Par laurentSc dans le forum Langage
    Réponses: 31
    Dernier message: 05/12/2009, 22h44
  5. Réponses: 12
    Dernier message: 29/10/2008, 15h27

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