Rückwärtssuche mit RegEx?

D

Dexxter

Hallo,

ich habe folgendes Problem. Ich möchte um einen Suchbegriff (Text) herum eine Zeile einer HTML-Tabelle matchen (möchte in später bei Perl in ein Array ablegen).

Da immer mit <TD> eingeleitet und mit </TD> abgeschlossen wird, dachte ich, es wäre recht einfach.

Mein Regulärer Ausdruck lautet:

Code:
<TR.*?>(Anzahl der Seitenimpressionen).*?</TR>
Er findet damit zwar das erste </TR>, was meinem Text folgt, aber bei der Suche nach dem <TR> findet er nicht das erste vor meinem Text, sondern das erste im gesamten Dokument.

Irgendwelche Vorschläge? Gibt es eine Möglichkeit -- ausser den Lookaheads und Lookbehinds, die ja keine Multiplikatoren zulassen -- eine First-Match-Suche nach links laufen zu lassen?

Text:

Code:
<!-- ----------------- Table: Allgemeine Statistik  ------------- -->

<P>

<CENTER><TABLE BORDER=1 CELLSPACING=0 WIDTH=90%>
<TR BGCOLOR="FFDD00">
<TD COLSPAN=2 ROWSPAN=1 NOWRAP><FONT SIZE=+1 FACE="Arial" COLOR="000000">
    <CENTER><B>Allgemeine Statistik </FONT><br><FONT SIZE=-2></FONT></B></CENTER>
</TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Datum und Uhrzeit der Berichterstellung</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">Mittwoch Januar 04, 2006 - 13.10.14</FONT></TD>

</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Zeitspanne</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">01.12.05 00.00.00 - 31.12.05 23.59.59</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Hits auf Homepage</B></FONT></TD>
<TD  ALIGN ="LEFT" >

    <FONT SIZE=2 FACE="Arial" COLOR="000000">35,738</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der erfolgreichen Hits auf die gesamte Site</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">40,274,354</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Seitenimpressionen</B></FONT></TD>

<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">6,292,185</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Anwendersitzungen</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">578,312</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >

    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anwendersitzungen aus Deutschland</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">42.25%</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Internationale Anwendersitzungen</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">51.16%</FONT></TD>

</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anwendersitzungen mit unbekanntem Herkunftsland</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">6.58%</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Mittlere Anzahl an Hits pro Tag</B></FONT></TD>
<TD  ALIGN ="LEFT" >

    <FONT SIZE=2 FACE="Arial" COLOR="000000">1,299,172</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Mittlere Anzahl an Seitenimpressionen pro Tag</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">202,973</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Mittlere Anzahl an Anwendersitzungen pro Tag</B></FONT></TD>

<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">18,655</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Mittlere Länge einer Anwendersitzung</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">00:03:35</FONT></TD>
</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >

    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der eindeutigen Besucher</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">392,654</FONT></TD>
</TR>
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Besucher, die nur einmal kamen</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">344,781</FONT></TD>

</TR>
<TR   BGCOLOR="F0F0F0">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Besucher, die mehrmals kamen</B></FONT></TD>
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">47,873</FONT></TD>
</TR>
</TABLE>
</CENTER>
<br><br>
Auf Rot und Blau wird gematcht. Es soll aber so gematcht werden:

Code:
<TR   BGCOLOR="FFFFFF">
<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000"><B>Anzahl der Seitenimpressionen</B></FONT></TD>

<TD  ALIGN ="LEFT" >
    <FONT SIZE=2 FACE="Arial" COLOR="000000">6,292,185</FONT></TD>
</TR>
 
Zuletzt bearbeitet von einem Moderator:
Probier mal folgenden regulären Ausdruck:
Code:
<TR[^>]*>(Anzahl der Seitenimpressionen).*?</TR>
 
Bin nun anders an die Sache herangegangen. Mein RegEx sieht nun so aus:

Code:
Anzahl der Anwendersitzungen(.*?</TD>)(<TD.*?>)(.*?<.*?>)(.*?)(</.*?TD>)
Im Grunde brauch ich nur die Beschreibung und den Wert, da ich dies mit Perl später in eine Textdatei schreiben möchte.

Folgendes Problem: Auf das, worauf ich mit (.*?<.*?>) matche, ist im HTML-Dokument der FONT-Tag. Da dieser nicht immer auftauchen muss, habe ich mir gedacht, ich setze ein ? dahinter, also so:

Code:
(.*?<.*?>)?
Er soll dann meinen Wert (im orangen Pattern) matchen, egal, ob ein FONT-Tag vorhanden ist oder nicht.

--------------------

Ohne ?:

Anzahl der Anwendersitzungen</B></FONT></TD><TD ALIGN ="LEFT" > <FONT SIZE=2 FACE="Arial" COLOR="000000">578,312</FONT></TD>

So ist es im Prinzip in Ordnung, aber nun muss ein FONT-Tag vorhanden sein (zumindest: leer, "<>").

--------------------

Mit ?:

Anzahl der Anwendersitzungen</B></FONT></TD><TD ALIGN ="LEFT" > <FONT SIZE=2 FACE="Arial" COLOR="000000">578,312</FONT></TD>

Hierbei verschluckt er nun meinen Wert im purpurfarbenen Pattern. :confused:
 
Wenn es sich bei dem „Wert“-Format immer um eine Zahl handelt, könntest du folgenden regulären Ausdruck verwenden:
Code:
(Anzahl der Anwendersitzungen).*?([0-9,]+)
Sind es jedoch auch noch andere Formate (etwa normale Zeichenketten), solltest du vielleicht erst einmal die HTML-Tags entfernen.
 

Neue Beiträge

Zurück