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 :

Expression qui ne contient pas une chaine


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 56
    Points
    56
    Par défaut Expression qui ne contient pas une chaine
    Bonjour,

    Je souhaiterais faire une expression régulière qui ne commence pas par une chaine donnée.. par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $test = preg_match('/^([^azerty][a-zA-Z0-9]{1,50}$/',$maChaine);
    Le problème avec mon exemple est qu'il ne comprend pas la chaine "azerty" mais chaque caractères de cette chaine... il interdit soit "a" ou "z" ou "e" etc....


    Merci d'avance pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 309
    Points : 15 641
    Points
    15 641

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Points : 56
    Points
    56
    Par défaut
    J'ai le mème pb, mais je comprend pas trop la solution de l'autre topic.

    En fait je veux interdire la chaine test seule.

    test = KO
    testtt = ok
    ttTest = ok
    eeetestaeze = ok
    sett = ok

    Je suis parti sur cette regex : ^((?!^test$).)*$ elle fonctionne bien si je fais mes tests en JavaScript mais mon objectif c'est de se servir de cette regex comme pattern dans un XML schéma, et là ça plante...

    Une idée ?

    Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Points : 56
    Points
    56
    Par défaut
    merci smain avec ton exemple celà résoud mon problème j'ai rajouté "?!" à mon expression

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /^((?!^azerty)[a-zA-Z0-9])$/
    par contre je n'ai pas la réponse à ta question désolé

  5. #5
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '/^((?!^azerty)[a-zA-Z0-9])$/'
    logiquement, il manque un +



    Si l’expression est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /^((?!^azerty)[a-zA-Z0-9])+$/
    alors elle est mal écrite parce qu’elle oblige le moteur de regex à examiner pour chaque caractère scruté s’il est le début d’une séquence '^azerty'.

    Or , pour tous les autres caractères que le premier, il ne peut y avoir matching de ’^azerty’ avec une séquence commençant par un caractère interne.



    Si l’expression est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /^((?!^azerty)[a-zA-Z0-9]+)$/
    alors elle est encore mal écrite puisque, étant donné la situation de (?!^azerty) dans la RE, cette assertion ne sera testée qu’en tête de la chaîne explorée (c’est à dire à la position 0). Le deuxième ^ est alors redondant.



    Je pense plus correct d’écrire la RE comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     /^(?!azerty)([a-zA-Z0-9]+)$/



    Tordu et marrant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import re
     
    chW = 'Wazertygertrudemonin'
    ch = 'azertygertrudemonin'
     
    patchapeau = re.compile('^([a-zA-Z0-9](?<!^azerty))+$')
    print patchapeau.search(chW)
    print patchapeau.search(ch)
     
    print '-----------------------------------'
     
    pat = re.compile('^([a-zA-Z0-9](?<!azerty))+$')
    print pat.search(chW)
    print pat.search(ch)
    résultat
    <_sre.SRE_Match object at 0x010AEF20>
    None
    -----------------------------------
    None
    None
    C’est pour montrer que la forme (?<!^azerty) est comprise par le moteur de regex, mais que pour le mettre en évidence, il faut une RE tordue.

    Je ne crois pas qu’il puisse y avoir un cas où l'on soit obligé de recourir à la forme (?!^xxxxxx ). Le placement de (?!xxxxxx ) après le signe ’^’ situé en tête d’une RE suffit à exprimer l’exclusion de ’xxxxxx’ comme début de chaîne.



    ==========================

    Pour le problème de smain46,

    - je n’ai pas compris s’il faut vérifier l’absence de ’test’ en tête de chaîne ou n’importe où dans le texte.

    - je me demande pourquoi il y a un $ au milieu de la RE

    - je ne sais pas ce que peut être une regex comme pattern dans un XML schéma

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Points : 56
    Points
    56
    Par défaut
    Oui en effet je pense que le $ au millieu ne sert pas à grand chose...à voir...

    En fait pour faire l'inverse d'une regex je fais cela :

    ^((?!maRegex).)*$

    et comme la regex sélectionnant la chaine null c'est : ^test$ je suis arrivé à cette regex : ^((?!^test$).)*$

    Pour expliciter mon problème , je veux interdire la chaine "test" seule.
    La regex que j'ai mis fonctionne en javascript mais pas comme pattern de restriction dans mon XML-schéma (il semblerait que ?! et ^chaine ne soit pas utilisable) je dois donc réécrire la regex sans utiliser ?! et ^chaine . Cela me parait impossible...

Discussions similaires

  1. Construire un objet qui n est pas une chaine de caractères
    Par adel25 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/11/2013, 10h57
  2. REGEX qui ne contient pas une sous-chaine
    Par Franky731 dans le forum C#
    Réponses: 4
    Dernier message: 02/04/2009, 15h11
  3. [RegEx] Je recherche une chaîne qui ne contient pas une certaine chaîne
    Par johann51 dans le forum Langage
    Réponses: 5
    Dernier message: 19/03/2008, 16h42
  4. Réponses: 3
    Dernier message: 20/02/2007, 15h48
  5. un module qui ne contient pas une fonction qu'il contient :?
    Par duplo dans le forum Général Python
    Réponses: 12
    Dernier message: 15/08/2006, 19h30

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