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 :
Pour un $texte (c'est du HTML) valant :
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);
J'obtiens ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4MON MOT<br /> ZOZO<br /> <b>MON MOT</b> <b>C'est MON MOT...</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>.
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 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 ?
Je vous remercie par avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part $pattern = '`(?!<b>)QUE METTRE ICI ?(MON MOT)ET ICI ?(?!</b>)`i';
Partager