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

modifier une chaine seulement hors tags html

13 réponses
Avatar
Xavier Brochard
Bonjour

Je ne sais pas si mon titre est bien choisi mais voilà:

Dans un résultat de recherche, je veux "colorer" (avec un tag html) le motif
recherché.

Dans la plupart des cas le format de résultat contiendra du code html. Mais
ce code n'est pas déterminé à l'avance, soit parce qu'il fait partie du
résultat, soit parce qu'il détermine le format et est choisi lors du
paramétrage du bazar.
Parfois le motif recherché figure aussi dans le code html, et bien
évidemment il ne faut alors pas le "colorer".

Cette expression rationnelle fonctionne assez bien, mais pas tout le temps:

eval { $print =~ s/>[^<]+/&paintFoundText($&)/gei };

(la fonction paintFoundText se contente d'ajouter un tag <span class=found>
autour du motif trouvé)

Elle a l'avantage d'être simple, et de ne pas trop ralentir le programme,
pour une "feature" de peu d'importance.

En cherchant des trucs plus élaboré (mais peu probants), je finis par penser
qu'il faudrait faire beaucoup beaucoup plus compliqué. Mais alors j'ai peur
que ça consomme trop de ressources.

Qu'en pensez vous? et avez vous des pistes?

J'ai essayé d'être clair et pas trop long, mais comme mon niveau de Perl
est faible... si c'est du charabia, engueulez-moi.

cordialement,
xavier

3 réponses

1 2
Avatar
Paul Gaborit
À (at) Mon, 12 Jul 2010 15:54:52 +0200,
Xavier Brochard écrivait (wrote):

Xavier Brochard wrote:
En re-parcourant les archives de la liste, je crois qu'une liste convient




ce n'est pas très élégant, mais ça marche bien:

my @listHtml = split (/(<[^>s]+>)/,$print);
$print = "";
foreach $x (@listHtml) {
$x = &paintFoundText($x) if ($x !~ m/^</);
$print .= $x;
}
(la fonction paintFoundText se contente d'ajouter un tag <span class=found>
autour du motif trouvé)



Je n'ajoute rien aux autres réponses données sur le fond du problème (je
suis d'accord avec les suggestions données et les parseurs HTML
fonctionnent vite et bien pour un résultat plus simple à mettre en
oeuvre au final).

Juste une remarque : n'utilisez pas le '&' pour appeler votre fonction
paintFoundText.

Petit extrait de 'perlsub' :

To call subroutines:

NAME(LIST); # & is optional with parentheses.
NAME LIST; # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME; # Makes current @_ visible to called subroutine.

Les deux derniers exemples de syntaxe ne sont que très rarement utilisés
et peuvent avoir des effets non voulus si on les utilise à tort... Le
simple usage des parenthèses permet de lever les ambiguïtés.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Olivier Miakinen
Le 13/07/2010 00:41, Xavier Brochard a écrit :

[utiliser un parseur de HTML]



[...] puisque on en revient au début, est ce que ça ne va pas être un peu lourd
pour une "feature" de peu d'importance?



Tout dépend de ce que recouvre ce « peu » d'importance.

S'il n'est pas grave que ça casse parfois des scripts JavaScript ou que
ça rende le document invalide en allant charcuter un élément TITLE ou
OPTION, parce que tu es toujours là pour réparer les choses à la main en
cas de besoin, alors oui, tu peux faire au plus simple. À la limite tu
n'as même pas besoin de programme : il te suffit de faire un petit coup
de vim dans les fichiers HTML qui t'intéressent.

Mais si tu préfères que ça fonctionne sans que tu aies besoin
d'inspecter un à un chaque résultat, alors ce sera moins lourd
d'utiliser un vrai parseur que de tenter de prévoir tous les cas via des
regexp. D'ailleurs Paul a confirmé que les parseurs HTML fonctionnaient
vite et bien (cela dit je ne peux pas t'en conseiller moi-même car je ne
connais pas encore Perl).

Cordialement,
--
Olivier Miakinen
Avatar
Xavier Brochard
Paul Gaborit wrote:

$x = &paintFoundText($x) if ($x !~ m/^</);
...


...
Juste une remarque : n'utilisez pas le '&' pour appeler votre fonction
paintFoundText.



ah oui c'est un oubli!
ce script a longtemps tourné avec Perl4, il est encore plein de vieilleries,
et du coup à force d'en lire... on en écrit!

merci pour toute l'aide apportée à mes questions de novice.

xavier
1 2