Reg Ex - Remplacer des mots sauf entre certaines balises

Eléphant du PHP | 113 Messages

27 juil. 2011, 14:24

Bonjour à tous, voici un exemple de texte:

Code : Tout sélectionner

$texte = 'Du texte avec un titre : <h1>super titre</h1> mais vaux mieux cliquer <a href="lien du titre ici"> sur ce titre ci </a> pour un meilleur titre'
Je souhaite remplacer tous les "titre" sauf ceux entre les balises H1 et A ce qui donnerais:

Code : Tout sélectionner

$texte = 'Du texte avec un REMPLACE : <h1>super titre</h1> mais vaux mieux cliquer <a href="lien du titre ici"> sur ce titre ci </a> pour un meilleur REMPLACE'

Je me démène avec les preg_replace et les assertions complexes mais rien à faire j'y arrive pas.

Code : Tout sélectionner

$reg = '#((?<! href="\w) \bmot\b (?! </a>))#ix';//(?! .*h1)
Voici un de mes derniers tests. Si qq'un est caler la dedans je suis preneur d'une piste :)

devlop78
Invité n'ayant pas de compte PHPfrance

28 juil. 2011, 15:31

Reponse pour suivre le sujet.

Eléphanteau du PHP | 39 Messages

30 juil. 2011, 05:58

Je pense avoir trouvé la solution ...

Code : Tout sélectionner

/(titre)|(?:<[A-z 0-9]{2}>[A-z ]+<\/[A-z 0-9]{2}>)|(?:<a [^>]+>[^<>]+<\/a>)/i
J'explique :

Je commence par dire ce que je cherches, donc "titre".

Code : Tout sélectionner

(titre)
Ensuite, je veux exclure les "titre" qui sont entre les balises "h1" et "a".

Premièrement, le "h1" (je l'ai mit flexible, donc il fonctionne avec h1, h2, h3, h4, h5 et h6).

Code : Tout sélectionner

(?:<[A-z 0-9]{2}>[A-z ]+<\/[A-z 0-9]{2}>)
Deuxièmement, le "a".

Code : Tout sélectionner

(?:<a [^>]+>[^<>]+<\/a>)
Au final, tous les "titre" seront dans la variable "$1" et tu n'as plus qu'à écrire quelque chose comme : $1 = 'Nouveau titre';

Voilà, j'espère que ça marchera ! :D
“We spend money that we do not have, on things we do not need, to impress people who do not care.”
― Will Smith

Eléphant du PHP | 113 Messages

01 août 2011, 11:46

Merci a toi, j'ai changer mon fusil d'épaule en passant par un parseur XML, mais ça fait tjs plaisir de pouvoir étudier ta solution.

Eléphanteau du PHP | 39 Messages

02 août 2011, 07:28

Cherchais-tu quelque chose de plus spécifique ou alors ma regex est exactement ce que tu as besoin ? Je peux la modifier au besoin.
“We spend money that we do not have, on things we do not need, to impress people who do not care.”
― Will Smith