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 :

Regex simple mais je m'arrache les cheveux [RegEx]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Regex simple mais je m'arrache les cheveux
    Bonjour à tous,

    Je retape mon message car je crois avoir fait une mauvais manip pour le poster.
    Je suis newbie avec un grand N en regex.
    Je viens de lire 3 tuttos très bien faits mais je n'y arrive pas (ce doit être l'âge )
    J'essaie de filtrer dans un texte les mots commençant par "visit" (et pouvant le contenir) à l'exception des mots "visiteur" ou "visiteurs".
    Donc : "visit", "visite", "visitons", visiterons" "visiter", ... --> OK mais pas "visiteur" ou "visiteurs".

    Quelsu'un peut-il me donner un coup de main ?

    Un grand merci d'avance !

    Thommen

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 857
    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 857
    Points : 6 555
    Points
    6 555
    Par défaut
    Quelles sont les tentatives que tu as déjà faites? Car même si elles ne sont pas couronnées de succès, c'est mieux d'apprendre de ses erreurs que d'obtenir du tout cuit, non?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonjour Cosmo,

    Tu as raison, dsl, je ne cherche pas du tout cuit mais à apprendre.
    Voici le regex le plus "abouti" selon ma compréhension :
    mais qui ne marche apparemment pas lorsque je le teste sur https://regex101.com ...

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 857
    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 857
    Points : 6 555
    Points
    6 555
    Par défaut
    Ok, alors tu as inversé le sens de la barre pour la classe \w (il faut un antislash) et pour que celle-ci couvre un nombre indéterminé de caractères, tu dois lui appliquer le quantificateur * (zéro ou plus). Ce qui donne:Maintenant, il faut ajouter les deux contraintes:
    • les mots qui commencent par "visit"
    • sauf "visiteur" et "visiteurs"


    Pour la première, un word boundary \b doit suffire: \bvisit\w*.

    Pour la deuxième, tu dois utiliser un test avant négatif (negative lookahead) (?!...) qui signifie "non suivi de ...". C'est juste un test, et ça ne consomme pas de caractères ce qui permet de le placer facilement à la position adéquate:Attention à bien comprendre ce qu'est une classe de caractères.

    Une classe de caractères c'est comme un sac dans lequel on aurait mis des caractères en vrac, il n'y a aucun ordre à l'intérieur et donc [abracadabra] est strictement équivalente à [abcdr]. Si on ne lui applique aucun quantificateur, une classe de caractère représente un des caractères dont elle dispose, n'importe lequel.
    À l'intérieur d'une classe, les caractères spéciaux comme | perdent leur sens spécial et ne sont plus que de simples caractères littéraux.

    Quand on veut grouper quelque chose dans une pattern, on utilise un groupe non capturant (?:bidule|truc) (ou capturant (bidule|truc) pour extraire son contenu plus tard).

    Méfies-toi des alternatives dont les éléments commencent de la même manière car le moteur de regex prend toujours celle qui réussi en premier. Par exemple visiteur|visiteurs ne trouvera jamais "visiteurs" car la première branche ("visiteur" sans le "s") réussira avant et l'autre ne sera jamais testée.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Je suis vraiment impressionné CosmoKnacki, ça fonctionne parfaitement et ton expliquation est très didactique.
    Un grand merci à toi et je continue à bûcher sur les regex, ça a l'air passionnant et très puissant.

    Bonne journée à toi et encore merci !

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

Discussions similaires

  1. [WD-2010] Remplacer à s'en arracher les cheveux.
    Par Eratche dans le forum Word
    Réponses: 3
    Dernier message: 08/09/2011, 18h09
  2. S'arrache les cheveux sur son DM :P
    Par Stanyslas dans le forum Requêtes
    Réponses: 0
    Dernier message: 19/04/2011, 19h57
  3. [RegEx] Regex simple mais qui ne fonctionne pas comme il faut
    Par yagami77 dans le forum Langage
    Réponses: 1
    Dernier message: 08/01/2011, 23h27
  4. [SSIS] [2K5] Merge Join : Je m'arrache les cheveux
    Par SebastienM dans le forum SSIS
    Réponses: 7
    Dernier message: 18/05/2009, 14h26
  5. Réponses: 3
    Dernier message: 06/09/2008, 01h18

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