modifier une chaine seulement hors tags html
Le
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
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

Poser une question


Il ne faut jamais manipuler directement du HTML sous forme de texte dans un
programme, c'est la porte ouverte à toutes les injections de code. Il faut
toujours manipuler le document sous forme d'arbre abstrait, et le convertir
en HTML textuel uniquement à la fin. Il y a plusieurs bibliothèques qui font
ça très bien.
Mille pardon, je me suis mal exprimé:
le code html ne vient pas d'un formulaire (donc n'est pas entré par un
utilisateur), il vient d'un format de sortie qui a été paramétré d'avance,
mais qui varieras d'une installation à une autre.
En re-parcourant les archives de la liste, je crois qu'une liste convient
bien: d'abord on split sur les tags html (construction de la liste), puis on
modifie les éléments qui ne contiennent pas d'html (boucle for each avec un
match).
Merci pour le conseil cela dit.
xavier
Le 12/07/2010 14:33, Xavier Brochard répondait à Nicolas George :
Je crois que tu t'étais bien exprimé, et que la réponse de Nicolas
reste valable avec ces précisions : plutôt que d'agir sur le HTML
généré, il vaudrait mieux agir sur le « format de sortie », juste
avant génération du HTML. Ce sera d'une part plus facile, et d'autre
part moins générateur de bug.
Cordialement,
--
Olivier Miakinen
J'aurais bien aimé que ce soit possible, mais ça ne l'est pas: le format de
sortie détermine ce qui est affiché.
Il s'agit en fait de requêtes dans une petite bases de donnés textuelle, le
"format de sortie" en liste de réponses indique le formatage html (ou pas)
et les champs affichés. Il y a un problème de conception initial qui empêche
d'agir avant le formatage de la sortie. Et je ne peux pas changer ça (pas
avant longtemps).
Merci pour la réponse, qui m'éclaire tout de même pas mal sur le défaut de
conception.
cordialement
xavier
Bon, dans ce cas je vais répondre à ta proposition précédente.
Le 12/07/2010 14:33, Xavier Brochard avait écrit :
Tu fais comme tu veux, mais méfie-toi quand même du fait que le texte à
remplacer pourrait se trouver, après avoir écarté les balises HTML,
dans un élément TITLE, ou un élément STYLE, où il ne faudrait pas faire
le remplacement, voire dans un élément SCRIPT, où remplacer pourrait
être parfois désirable et parfois dangereux.
Cordialement,
--
Olivier Miakinen