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 :

Assertion avant négative [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 47
    Points
    47
    Par défaut Assertion avant négative
    Bonjour à tous,

    J'ai un peu de mal avec l'expression régulière suivante et pourtant j'ai cherché et lu de la doc.
    Je fais donc appel à vous.

    Pour l'exemple, j'essaie d'entourer dans un texte les occurences du mot "MON MOT" par les termes "#AVANT#" et "#APRES#".
    Par contre je ne veux pas de remplacement si "MON MOT" est écrit en gras (il est entouré par une balise <b>C'est MON MOT</b> par exemple).

    J'effectue donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $pattern = '`(?!<b>)(MON MOT)(?!</b>)`i';
    $replacement = '#AVANT#$1#APRES#';
    $texte = preg_replace($pattern, $replacement, $texte);
    Pour un $texte (c'est du HTML) valant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MON MOT<br />
    ZOZO<br />
    <b>MON MOT</b>
    <b>C'est MON MOT...</b>
    J'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #AVANT#MON MOT#APRES#<br />
    ZOZO<br />
    <b>MON MOT</b>
    <b>C'est #AVANT#MON MOT#APRES#...</b>
    Le "C'est MON MOT..." de la 4ème ligne qui est un texte en gras a été renommé alors qu'il est pourtant entouré par une balise <b></b>.

    Le problème vient du fait qu'il y a le mot "C'est" avant mon mot et les "..." après. Je ne vois pas comment dire dans l'expression régulière qu'entre l'assertion négative (?!<b>) et la parenthèse capturante (MON MOT), il peut y avoir tout autre caractère ou chaine différente de "MON MOT". De même après le mot et avant l'autre assertion.

    Je pense donc qu'il manque quelque chose dans mon expression mais que mettre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`(?!<b>)QUE METTRE ICI ?(MON MOT)ET ICI ?(?!</b>)`i';
    Je vous remercie par avance

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`(?!<a[^>]+>)(MON MOT)(?!</a>)`i';
    Dans le cas du lien, tu recherches MON MOT juste après la balise de fermeture du lien. D'où erreur.

    Un truc du genre serait un bon commencement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`(?!<a[^>]+>)[^<]*(MON MOT)[^<>]*(?!</a>)`i';
    C'est juste un commencement, c'est pour le cas où il n'y a pas de balise imbriquée. A toi d'adapter.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 59
    Points : 47
    Points
    47
    Par défaut
    Merci pour ta réponse.

    Effectivement je viens de me rendre compte de mon erreur et j'ai d'ailleurs changé mon exemple et mis à jour mon post (avec une balise <b> au lieu de <a> lors du premier post).

    Le problème étant identifié, pourrais-tu m'en dire plus ?

    Je te remercie par avance pour ton aide.

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

Discussions similaires

  1. [Python 2.X] probleme expression reguliere assertion avant négative
    Par xavier-Pierre dans le forum Général Python
    Réponses: 2
    Dernier message: 03/04/2015, 13h54
  2. [RegEx] assertions négatives
    Par SSJ17Vegeta dans le forum Langage
    Réponses: 12
    Dernier message: 01/09/2010, 15h06
  3. [RegEx] Assertions négatives
    Par nasuu dans le forum Langage
    Réponses: 2
    Dernier message: 17/05/2010, 11h40
  4. [RegEx] Assertion négative avec ereg_replace()
    Par citronbleu-v dans le forum Langage
    Réponses: 2
    Dernier message: 17/04/2008, 15h11
  5. [RegEx] Assertion négative dans une classe
    Par xuoy dans le forum Langage
    Réponses: 8
    Dernier message: 20/02/2006, 12h59

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