Thread ganzer bereich aus html parsen (6 answers)
Opened by ptk at 2004-01-20 13:54

Crian
 2004-01-21 11:24
#79317 #79317
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ok, die RE war noch nicht ganz richtig... hier die getestete richtige Variante:

Code: (dl )
1
2
3
4
5
6
7
8
9
m~<span[^>]*id="Historybar1_lbHistBar"[^>]*>
  (
   (?:
    <span[^>]*>(?:(?!</span>).)+</span>
    |
    (?!</span>).
   )+
  )
 ~xs


Getestet in folgendem Code (Wobei die auseinandergezogenen Doppelunterstriche wieder zusammenzuziehen sind (ist ein Boardfehler)):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/perl
use strict;
use warnings;

my $data;
{
    local $/;       # Slurp-Mode
    $data = <DATA>;
}

if ( $data =~ m~<span[^>]*id="Historybar1_lbHistBar"[^>]*>
                (
                 (?:
                  <span[^>]*>(?:(?!</span>).)+</span>
                  |
                  (?!</span>).
                 )+
                )
               ~xs
   )
{
    print "Treffer:\n$1\n";
}
else {
    print "Kein Treffer.\n";
}


_ _ DATA _ _
<p>Dies ist ein Auszug aus einem <span class="xxx">m&ouml;glichen</span>
HTML-Dokument.</p>

<p>
<span id="Historybar1_lbHistBar" class="path">
<a class="path" href="../../main/default.aspx?lang=EN">xyz.com</a>
/
<a class="path" href="../../main/automotive/default.aspx?lang=EN&cat=Automotive">Automotive</a>
/
<span>Products & solutions</span>
/
<span>Acoustic know-how</span></span>
</p>

<p><span class="xxx"><span class="y">Ein</span> weiterer
dummer <span class="z">Testtext</span></span>.</p>


Mit der Ausgabe

Code: (dl )
1
2
3
4
5
6
7
8
9
Treffer:

<a class="path" href="../../main/default.aspx?lang=EN">xyz.com</a>
/
<a class="path" href="../../main/automotive/default.aspx?lang=EN&cat=Automotive">Automotive</a>
/
<span>Products & solutions</span>
/
<span>Acoustic know-how</span>



Erklärung zur RE: Schauen wir uns den Audruck einmal an.

<span[^>]*id="Historybar1_lbHistBar"[^>]*>

Er fängt mit dem eindeutig gekennzeichneten span an, so wie es in Deinem Beispiel aussah war diese id die eindeutige Kennung.

Das was nun folgt wird in einer Klammer gefangen, damit es hinterher in der Variablen $1 steht.

Was darf nun hier folgen? Ein bis beliebig viele Dinge, die folgendermaßen beschaffen sein dürfen:

1) <span[^>]*>(?:(?!</span>).)+</span> komplette in span-Tags eingeschlossene Ausdrücke (denn diese darf man ja schachteln).

oder

2) (?!</span>). Zeichen, die nicht der Anfang von "</span>" sind

Der Ausdruck wird aufhören, wenn er an das </span> des ursprünglichen (besonderen) span-Tags stößt, da das erste Zeichen davon ("<") weder auf die erste noch auf die zweite erlaubte Kategorie passt.

Edit: Mal wieder Smilies ausgeschaltet :-[

Edit2: Grenzen: Kommen in Deinem span wiederum ineinander verschachtelte spans vor, wird ein falsches Ergebnis zurückgeliefert. Deshalb ist es - wie so oft - besser, einen echten Parser zu verwenden, der mit solchen Sachen klarkommt.
Man könnte jetzt die RE noch auf eine Schachtelstufe weiter aufwulsten, aber das löst das Problem nicht. Deshalb kann soetwas immer nur eine Notlösung sein.\n\n

<!--EDIT|Crian|1074677558-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite

View full thread ganzer bereich aus html parsen