Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Remplacement dans texte mais pas dans le code html

4 réponses
Avatar
Guillaume
Bonjour,

J'ai essayé de mettre en place un petit moteur de recherche sur mon site
(tout simple, à base de requetes like ou expression régulière sql).

La recherche se fait sur du texte html stocké dans une table. Je
souhaite que l'affichage du résultat mette en avant le mot clé saisi par
l'internaute en le "surlignant".

J'utilise pour cela quelque chose comme ca:

if(isset($_GET['motcle']) AND $_GET['motcle']!='')
{
$contenu=eregi_replace($_GET['motcle'],'<span style="background-color:
rgb(255, 255, 0);">'.$_GET['motcle'].'</span>',$row['contenu']);
}


Tout se passe correctement dans la majorité des cas: les mots clés du
contenu sont "entourés" par le code css.

Néanmoins, lorque l'internaute tape juste une lettre (par exemple a),
tout les a du contenu html sont remplacés (y compris ceux figurant dans
des <a href...> (ou autre html/css) qui devient:
<<span style="background-color: rgb(255, 255, 0);">a/<span> href...


J'ai du mal à corriger cela. Je ne vois pas quelle expression régulière
ou technique je pourrais utiliser pour éviter que le remplacement ne se
fasse dans le code html

Quelqu'un aurait-il une piste?

Merci

--
Guillaume

4 réponses

Avatar
Etienne SOBOLE
J'ai du mal à corriger cela. Je ne vois pas quelle expression régulière
ou technique je pourrais utiliser pour éviter que le remplacement ne se
fasse dans le code html


peut etre faire un split('<', $html)
puis pour chaque ligne tu tableau faire un split('>', $ligne)

tu devrais avoir la balise dans le premier champ et le text dans le
deuxieme.
donc ne remplacer que le deuxième...


sinon faut chercher un truc du style >.*<
ce devrai aussi etre de texte !!!

Etienne

Avatar
loufoque
Guillaume a dit le 01/10/2005 à 14:38:

J'ai du mal à corriger cela. Je ne vois pas quelle expression régulière
ou technique je pourrais utiliser pour éviter que le remplacement ne se
fasse dans le code html


Je n'ai pas trop d'idée, à part un (?!<.*?>) qui ne fonctionne pas
avec les moteurs d'expressions régulières dont dispose PHP.

Il va falloir faire sans les expressions régulières.

Avatar
Guillaume
Guillaume a dit le 01/10/2005 à 14:38:

J'ai du mal à corriger cela. Je ne vois pas quelle expression régulière
ou technique je pourrais utiliser pour éviter que le remplacement ne se
fasse dans le code html



Je n'ai pas trop d'idée, à part un (?!<.*?>) qui ne fonctionne pas
avec les moteurs d'expressions régulières dont dispose PHP.

Il va falloir faire sans les expressions régulières.


Ben apparemment, si! ;-)


En rtfmisant un peu, j'ai réussi à trouver mon bonheur.


Pour ceux que ca intéresse, je rappelle que l'idée est de faire un
surlignement "à la google" sur une recherche de mot clé mais sans
"corrompre les tag html"


Dans les commentaires de la fonction preg_replace
(http://fr.php.net/preg_replace) quelqu'un indique un lien vers le site:

http://aidan.dotgeek.org/repos/?file=function.str_highlight.php

Je me laisse encore 2 ou 3 semaines pour comprendre l'expression
rationnelle utilisée #(?!<.*?)(%s)(?![^<>]*?>)# mais j'ai pu adapter la
superbe fonction à ce que je voulais faire.


Merci à Etienne et loufoque pour leurs pistes et à Aidan Lister pour sa
fonction.

--
Guillaume


Avatar
loufoque
Guillaume a dit le 03/10/2005 11:42:

Ben apparemment, si! ;-)



Hmm je croyais qu'on ne pouvait pas avoir une taille non fixe dans un
lookaround, mais en fait c'est uniquement pour les lookbehind.