OVH Cloud OVH Cloud

[RegEx] Ou sont les erreurs ?

2 réponses
Avatar
OAM
Bonsoir,

Je n'arrive pas à comprendre pourquoi le code suivant ne fonctionne pas .
Dans l'affichage contents2, des lettres disparaissent mystérieusement.
Dans l'affichage contents3, cela ne fonctionne pas !!!

Je n'arrive pas à trouver les erreurs...

Merci d'avance.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title></title>
</head>
<body>

<?php
ob_start();
?>

<span>Lorem</span> ipsum <a href='#'>dolor</a> sit amet, <span>consetetur
sadipscing elitr</span>, sed diam nonumy eirmod tempor invidunt ut labore et
dolore magna
aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus
est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et
dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et
justo duo dolores et ea rebum. Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor
sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero
eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

<?php
$contents = ob_get_contents();
ob_end_clean();

$mot='dolor';
$contents1=eregi_replace("($mot)","<span style='background:
green'>\\1</span>",$contents);
$contents2=eregi_replace("($mot)[^(<span>(.*)</span>)]","<span
style='background: yellow'>\\1</span>",$contents);
$contents3=eregi_replace("($mot)[^(<a href='#'>(.*)</a>)]","<span
style='background: yellow'>\\1</span>",$contents);

echo($contents1);
echo('<hr />');
echo($contents2);
echo('<hr />');
echo($contents3);
echo('<hr />');
?>

</body>
</html>

2 réponses

Avatar
Olivier Miakinen

Je n'arrive pas à comprendre pourquoi le code suivant ne fonctionne pas .
Dans l'affichage contents2, des lettres disparaissent mystérieusement.
Dans l'affichage contents3, cela ne fonctionne pas !!!

[...]

$mot='dolor';
$contents2=eregi_replace("($mot)[^(<span>(.*)</span>)]","<span
style='background: yellow'>1</span>",$contents);


Ici, tu lui demande d'effacer après chaque dolor tout caractère qui
n'est pas une parenthèse ouvrante, un chevron gauche, un s, un p, un a,
un n, encore une parenthèse ouvrante, un point, une étoile, etc.

Pour tout dire, [^(<span>(.*)</span>)] est équivalent à [^*.)(><anps/],
ce qui n'est probablement pas ce que tu veux.

D'une manière générale, une syntaxe entre crochets [...] ne peut jamais
compter que pour *un* unique caractère.

$contents3=eregi_replace("($mot)[^(<a href='#'>(.*)</a>)]","<span
style='background: yellow'>1</span>",$contents);


Là c'est le même problème : [^(<a href='#'>(.*)</a>)] est strictement
équivalent à [^*.)(><'#aefhr ].


Pour exclure d'une expression régulière des chaînes entières, d'abord il
faut utiliser les expressions compatibles Perl au lieu des vieux machins
Posix, et puis il doit probablement falloir se coltiner les assertions,
ce qui nécessite au moins trois ans d'études supérieures en regexp. ;-)

Explique-nous plutôt ce que tu cherches à faire, et on te trouvera bien
un truc pour t'en sortir avec les moyens du bord.

Avatar
OAM
Explique-nous plutôt ce que tu cherches à faire, et on te trouvera bien
un truc pour t'en sortir avec les moyens du bord.


En effet, j'étais loin de la solution et de comprendre les expressions
régulières :(
Le but du code (dont j'avais extrait le coeur) que je voulais (et que je
voudrais) faire est le suivant:
Avant d'envoyer une page dynamique, je balaye le code html (d'ou
l'utilisation de la bufférisassion) afin de rechercher les mots de la page
qui serait référencé dans un dictionnaire. Si tel est le cas, je voudrais le
mot, par le même mot qui pointe vers sa définition, en un mot l'encadrer
d'une balise <a href="...">...</a>. Le problème c'est qu'il faut que je ne
traite pas les mots qui sont déjà entre des balises <a></a> sinon il y aura
une double imbrication. De même je dois extraire les mots dans une balise
(img src="..."... /> car si le mot cherché se trouve dans sr="...", cela va
poser des problèmes.
Cela me semble pas si compliqué que cela, et je pensais m'en sortir avec les
expressions régulières, plutôt que de parser le code en XML.
Bon en espérant avoir été claire... si tu as une solution à me proposer...
merci d'avance !