2010-11-25 11 views
1

Guten Morgen ExtrahierenRegex für nur TR mit TDs

Ich versuche, eine Tabellenzeile (TR) zu erhalten, die eine oder mehrere Tabellenzellen (TDs) haben müssen:

Mit diesen String

<TABLE> 
<TR valign="top"> 
    <TH>First</TH> 
    <TH>2nd</TH> 
    <TH>3rd</TH> 
    <TH>4th</TH> 
</TR> 
<TR valign="top"> 
    <TD width="15%">Michael Jackson</TD> 
    <TD width="5%">Cramberries</TD> 
    <TD width="25%">Pixies</TD> 
    <TD width="45%">The Ramones</TD> 
</TR> 
</TABLE> 

möchte ich bekommen:

<TR valign="top"> 
    <TD width="15%">Michael Jackson</TD> 
    <TD width="5%">Cramberries</TD> 
    <TD width="25%">Pixies</TD> 
    <TD width="45%">The Ramones</TD> 
</TR> 

was wäre das beste Muster ein zum Extrahieren oder mehr TRs mit verschachtelten TDs ?

+2

'Du sollst nicht regex verwenden HTML' zu analysieren. Verwenden Sie eine DOM-Manipulationsbibliothek in Ihrer Sprache. –

+0

@Jan Es wird in C# zum Parsen einer HTML-Zeichenfolge verwendet –

+0

Bitte lesen Sie diese Antwort http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454 –

Antwort

1

Dieser arbeitet

Regex.Matches(sourceHtmlString, @"(?<1><TR[^>]*>\s*<td.*?</tr>)", 
       RegexOptions.Singleline | RegexOptions.IgnoreCase) 
1

10 sollte funktionieren, aber die Groß-/Kleinschreibung nicht beachten und mehrzeilig Flags.

Aber ich stimme voll und ganz mit Jan Kommentar oben überein. Verwenden Sie einen HTML-Parser, der wesentlich robuster und lesbarer ist.

+0

Das wird nicht funktionieren? 'Regex.Matches ("

Michael Jackson Cramberries Pixies Die Ramone
", @ " *)?>. *? ] *)?>. *?] *)?> ", RegexOptions.Multiline | RegexOptions.IgnoreCase)' –

-1

Dies sind keine regulären Ausdrücke. Wenn Sie beispielsweise versuchen, Ihren Text mit <tr[^>]*>.*?<td[^>]*>.*?</tr> abzugleichen, wird die Zeile <th> und die erste Zeile <td> übereinstimmen. Sie sollten zuerst die Zeilen abgleichen und dann versuchen, jede Zeile nach <td> zu durchsuchen.

Oder noch besser, verwenden Sie einen HTML-Parser. HTML ist kein regular language und kann nicht wirklich von einem regulären Ausdruck analysiert werden.

+0

Die normale Sprache trifft nicht auf moderne Regexes zu, noch auf irgendetwas mit '(.) \ 1'. – tchrist

+0

Ja," moderne "reguläre Ausdrücke können mehr als nur normale Sprachen abgleichen, aber sie sind immer noch nicht in der Lage, nicht-triviales HTML zu verarbeiten. – robert

0

Wohin läuft das genau? Wenn Sie dies im Browser ausführen, gibt es in Javascript bessere Möglichkeiten als regulärer Ausdruck (z. B. jQuery Selektoren auf tr: hat (td) als zufälliges Beispiel)

Wenn Sie es auf einem Server ausführen- Nebenumgebung, z PHP, regulärer Ausdruck kann funktionieren.

So etwas wie: (] +>.?)

Grund, warum ich darauf hindeutet, dass sonst nichts im Gegensatz - Sie den gesamten Inhalt erhalten möchten, so die ganze Sache in Klammern wickeln, die TR und TD kann oder darf keine Breite haben, tut nie weh, um über solche Dinge sicher zu sein.

Die. *? Die Konstruktion sollte in den meisten Regexp-Engines nicht gierig sein, also passen Sie die kleinste übereinstimmende Zeichenkette an - was verhindern sollte, dass ... angepasst wird. Müsste immer noch multiline und case insensitivity, in der Regel m und ich, auch gesetzt werden. (Ich habe das jedoch nicht getestet)

Aber wie robert darauf hinweist, wäre auf der Serverseite ein geeigneter HTML-Parser besser, entweder die DOM- oder XML-Erweiterungen sollten damit umgehen können.