Le traitement HTML avec regex est une mauvaise idée, mais il semble approprié pour cette situation. Description: Avec un fichier .html, je dois analyser les liens internes, extraire le niveau d'indentation, le texte du lien et le numéro de page sur lequel il réside dans un fichier .txt externe qui est ensuite transmis à quelqu'un d'autre.Perl regex analyse uniquement le fichier; pas de fin au début
Donc, étant donné cet échantillon HTML:
<TR valign="bottom">
<TD valign="top"><DIV style="margin-left:0px; text-indent:-0px"><A href="#101"><FONT style="font-variant:small-caps;">The “Offering“</FONT>
</A></DIV></TD>
<TD> </TD>
<TD nowrap align="right" valign="top"> </TD>
<TD align="right" valign="top">1</TD>
<TD nowrap valign="top"> </TD>
</TR>
<TR valign="bottom">
<TD valign="top"><DIV style="margin-left:15px; text-indent:-0px"><A href="#102">Sales & Property
</A></DIV></TD>
<TD> </TD>
<TD nowrap align="right" valign="top"> </TD>
<TD align="right" valign="top">2</TD>
<TD nowrap valign="top"> </TD>
</TR>
Le fichier externe produira:
0|The "Offering"|4
15|Sales & Property|5
(numéros de page sont différents parce qu'ils sont le numéro de page réelle, pas référence folio).
Je l'ai principalement compris, sauf pour 1 partie, lorsque le texte du lien contient des codes HTML supplémentaires, comme la balise <Font>
dans le premier lien.
Voici mon regex pour extraire les liens (note $ string contient le code html ci-dessus):
while ($string =~ m/<DIV style="margin-left:([0-9]+)px; text-indent:[-0-9]+px"><A href="#([0-9]+)">([a-zA-Z0-9\.,:;&#\s]+)<\/A>/gi) {
push(@indents,$1);
push(@linkIDs,$2);
push(@names,escapeHTML($3));
};
qui va extraire correctement le second, mais pas la première, à cause des> < et d'autres symboles dans le code HTML.
Si je change que le dernier groupe de capture à .+
ou .*
, je reçois l'ensemble du fichier HTML (bien, entre le premier <Div><A>
et le dernier </A>
. Il semble que le modèle commence au début, mais correspondant à partir de la fin . du fichier en arrière
Voici un lien vers un constructeur de regex en ligne: http://regexr.com?2s0po
correctement trouve ce que je dois, mais en Perl je ne reçois pas les mêmes résultats (que le fichier entier comme mentionné)
Je n'arrive pas à écrire quoi que ce soit qui capturera chaque grou p correctement - vous penseriez que le "curseur" avance et s'arrête au premier </A>
vu depuis le début du fichier.
Toute aide, d'opinions ou de conseils serait grandement appréciée. -Je vous remercie.
Ceci est un scénario _perfect_ pour l'utilisation d'un analyseur HTML. Les expressions régulières sont totalement le mauvais outil. Je ne connais pas le paysage des parseurs Perl HTML, mais quelqu'un devrait pouvoir vous suggérer quelque chose. –