OVH Cloud OVH Cloud

preg_replace et tags html

3 réponses
Avatar
Thierry
Salut,

J'ai un pb qui, a mon avis, doit etre résolu avec les PCRE.

Mon PB: J'ai du code HTML, je dois remplacé un mot par un autre
SAUF SI il se trouve dans une balise html (entre un < et un >)
ou une balise A (entre un <a...> et un </a>)

un exemple pour mieux comprendre: je veux remplacer "toto" par "YOYO"
dans le code HTML ci dessous
source:
titi toto <a href="toto"> tutu toto </a><tag toto> toto tutu TOTO
</tag>
resultat:
titi YOYO <a href="toto"> tutu toto </a><tag toto> YOYO tutu YOYO
</tag>

Pour ce qui est des balise j'ai trouvé l'expression suivant:
preg_replace('#(toto)(?![^<]+>)#si','YOYO',$html);

Mais comment inclure dans cette expression, l'exclusion des balise <A>
?

Merci d'avoir eu le courage de m'avoir lu jusqu'ici,
Merci++ a ceux qui vont répondre.

... Thierry

3 réponses

Avatar
P'tit Marcel
Mon PB: J'ai du code HTML, je dois remplacé un mot par un autre
SAUF SI il se trouve dans une balise html (entre un < et un >)
ou une balise A (entre un <a...> et un </a>)

Pour ce qui est des balise j'ai trouvé l'expression suivant:
preg_replace('#(toto)(?![^<]+>)#si','YOYO',$html);


je crois que cela ne fonctionnera pas si toto est en fin de balise :
<blablabla toto> ==> <blablabla YOYO>
ou bien s'il y a un > qui traîne tout seul :
toto est > que tata ==> inchangé

J'ai un peu la flemme de chercher, mais si personne ne se dévoue
j'essayerai de torcher un masque plus complet avec une assertion arrière.


Mais comment inclure dans cette expression, l'exclusion des balise <A> ?


je ne vois pas pourquoi tu veux interdire les remplacements pour le
*texte* décrivant un lien (et donc pas pour le lien lui-même) ? Si tu
convertit le texte de la page, pourquoi pas en particulier le texte des
liens ?

eça
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/

Avatar
Thierry
Mon PB: J'ai du code HTML, je dois remplacé un mot par un autre
SAUF SI il se trouve dans une balise html (entre un < et un >)
ou une balise A (entre un <a...> et un </a>)

Pour ce qui est des balise j'ai trouvé l'expression suivant:
preg_replace('#(toto)(?![^<]+>)#si','YOYO',$html);


je crois que cela ne fonctionnera pas si toto est en fin de balise :
<blablabla toto> ==> <blablabla YOYO>
ou bien s'il y a un > qui traîne tout seul :
toto est > que tata ==> inchangé

J'ai un peu la flemme de chercher, mais si personne ne se dévoue j'essayerai
de torcher un masque plus complet avec une assertion arrière.


Mais comment inclure dans cette expression, l'exclusion des balise <A> ?


je ne vois pas pourquoi tu veux interdire les remplacements pour le *texte*
décrivant un lien (et donc pas pour le lien lui-même) ? Si tu convertit le
texte de la page, pourquoi pas en particulier le texte des liens ?

eça


La regle ci dessus ('#(toto)(?![^<]+>)#si') fonctionne parfaitement
quelque soit la position de toto dans la phrase en dehors d'une balise
html.

Pourquoi ne pas modifier a l'interieur des liens ?
Imaginons que a la place de YOYO je veuille mettre "<a
href='parici'>YOYO</a>".
Dans ce cas je vais me retrouver avec un lien coupé du style:
<a href='parla'> la page a <a href='parici'>YOYO</a> et par la</a>

a moins que l'on puisse recoller le lien par derriere comme:
<a href='parla'> la page a </a><a href='parici'>YOYO</a><a
href='parla'> et par la</a>

Si c'est possible (il parait que tout est possible avec les expressions
regulieres!) je suis preneur aussi.

Merci et a+... Thierry


Avatar
P'tit Marcel
Mon PB: J'ai du code HTML, je dois remplacé un mot par un autre
SAUF SI il se trouve dans une balise html (entre un < et un >)


J'ai un peu la flemme de chercher, mais si personne ne se dévoue
j'essayerai de torcher un masque plus complet avec une assertion arrière.



essaye avec ce masque :
'#(?<!<[^>]*)(toto)(?![^<]*>)#siU'


(non testé, sans garantie)
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/