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 sur mot Mer [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 31
    Points : 17
    Points
    17
    Par défaut Regex sur mot Mer
    Bonjour,
    Je cherche à retrouver le mot "mer" dans un texte (ex: bord de mer) à l'aide la function preg_match :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (preg_match("#mer#i", $string)) echo "ok";
    La function repère tous les mots contenant "mer", ex: commerce.
    Hors , je souhaite uniquement retrouver le mot "mer" sachant que celui-ci peut être au début du texte, à la fin, au milieu et tout seul.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("#^mer$|[\s]mer[\s]|^mer[\s]|[\s]mer$#i", $string) echo "ok";
    Cette syntaxe semble fonctionner mais je la trouve un peu lourde à écrire, n'y a t'il pas une regex plus simple pour arriver au même résultat ?


    Merci de votre aide

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2016
    Messages : 5
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Tout simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("/\bmer\b/i", $string)
    Ça utilise ce que les anglophones appellent "boundary", pour la doc PHP c'est ICI

    Cordialement

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Parfait merci. C'est ce que je cherchais.

    Par contre j'ai un comportement aléatoire dès qu'il y a des accents

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (preg_match("#\bvic[ée]rale\b#i", "vicérale")) echo "OUI" // NON
    if (preg_match("#\bvic[ée]rale\b#i", "vicerale")) echo "OUI" // OUI
    if (preg_match("#\bintitul[ée]\b#i", "intitulé")) echo "OUI" // OUI
    if (preg_match("#\bintitul[ée]\b#i", "intituléxxx")) echo "OUI" // OUI
    if (preg_match("#\bintitul[ée]\b#i", "xxxintitulé")) echo "OUI" // NON
    if (preg_match("#\bintitul[ée]\b#i", "intitule")) echo "OUI" // OUI
    if (preg_match("#\bintitul[ée]\b#i", "intitulexxx")) echo "OUI" // NON
    Une idée ?

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si tes pages sont en UTF8, ajoute le modificateur "u" à ton expression

    Si j'étais toi par contre je ferai l'inverse : je retirerai les accents du texte plutôt que de tous les lister dans mes expressions.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Invité
    Invité(e)
    Dernière modification par Invité ; 04/06/2016 à 08h38.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Si tes pages sont en UTF8, ajoute le modificateur "u" à ton expression
    Ce bon vieux utf8, merci

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    En affinant, je rencontre un nouveau problème.
    Je souhaite toujours retrouver le mot "mer" SAUF lorsqu'il est suivi par "rouge".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $string = "mer verte";
    if (preg_match("#\bmer\b#iu", $string) && !preg_match("#\bmer rouge\b#iu", $string)) echo "OUI"; // OUI
    Ca fonctionne mais je n'arrive pas à réunir cette condition dans un seul et même Regex.
    J'ai essayé ça sans succès...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $string = "mer verte";
    if (preg_match("#\bmer\b(^rouge)#iu", $string)) echo "OUI"; // NON
    Merci.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $regex = '#(?=(\bmer\b)(?! rouge\b))#Ui';
    Comme j'ai trouvé en faisant plusieurs recherches (par curiosité intellectuelle), je te laisse chercher aussi :

    : "regex if then" et "regex not".
    Dernière modification par Invité ; 04/06/2016 à 10h40.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    merci

  10. #10
    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
    Plus simplement tu peux écrire dans le cas présent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regex = '~\bmer\b(?! rouge\b)~i';
    Le modificateur u n'a de raison d'être que si tu utilises des caractères en dehors de la plage ASCII (pour "mer rouge" ce n'est pas le cas).

    Concrètement le modificateur u fait deux choses:
    1. il considère la chaîne cible comme une chaîne encodée en utf-8. Ce qui veut dire que chaque octet ne représente plus forcément un caractère mais peut être part d'une séquence qui elle représente un caractère. Par exemple "o" (qui est dans la plage ASCII) est codé sur un seul octet 6F, alors que "ô" (le caractère unicode U+00F4) en utf-8 est codé sur deux octets C3 et B4.
    2. il étend les classes de caractères utilisées dans la pattern (qui par défaut ne contiennent que des caractères de la plage ASCII, comme \s, \w, \d ou leurs compléments \S, \W, \D) à l'unicode


    Les "limites de mots" (word boundaries) \b étant définies en fonction de \w, il est clair que si \w change, alors \b change également.

    Donc dans un contexte ASCII (sans le modificateur u)\w ne correspond qu'à [A-Za-z0-9_], \bAndré\b ne matchera pas la chaîne "André mange des carottes". Par contre, avec le modificateur u, cette fois-ci, \w contient également les caractères accentués, ce qui redéfini le sens de \b. La pattern alors réussira.

    Ces deux aspects du modificateur u peuvent être activés de manière séparée en plaçant en début de pattern (*UTF8) pour activer la lecture de la chaîne sujet comme une chaîne utf-8 (donc comme des séquences d'octets représentant des caractères) et (*UCP) pour étendre les classes de caractères à l'unicode.

    Il est donc possible d'écrire pour le même résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('~\bAndré\b~u', 'André mange des carottes')
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('~(*UTF8)(*UCP)\bAndré\b~', 'André mange des carottes')
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. Regex sur syntaxe mot de passe
    Par raks13 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 29/03/2011, 18h17
  2. regex sur mot en gras seulement
    Par scalpa98 dans le forum VB.NET
    Réponses: 0
    Dernier message: 16/02/2010, 17h07
  3. Recherche sur mots de 3 lettres
    Par mamizo dans le forum Bases de données
    Réponses: 7
    Dernier message: 16/02/2005, 14h59
  4. [jakarta][regex]Matcher mot en entier.
    Par thibaut dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 26/05/2004, 13h33

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