1

おはようございます

1つ以上のテーブルセル(TD)が必要なテーブル行(TR)を取得しようとしています。

この文字列を持っている

<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>

取得したい:

<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>

ネストされたTDを持つ1つ以上のTRを抽出するための最良のパターンは何でしょうか?

4

4 に答える 4

1

<tr(\s[^>*)?>.*?<td(\s[^>]*)?>.*?</tr(\s[^>]*)?>動作するはずですが、大文字と小文字を区別しない複数行のフラグを設定します。

しかし、私は上記のJanのコメントに完全に同意します。はるかに堅牢で読みやすいhtmlパーサーを使用します。

于 2010-11-25T11:31:00.173 に答える
1

これは機能しています

Regex.Matches(sourceHtmlString, @"(?<1><TR[^>]*>\s*<td.*?</tr>)", 
              RegexOptions.Singleline | RegexOptions.IgnoreCase)
于 2010-11-25T15:38:43.190 に答える
0

これは正確にどこで実行されていますか?これをブラウザーで実行している場合、Javascriptでは、正規表現よりも優れた方法があります(たとえば、ランダムな例としてtr:has(td)のjQueryセレクター)

PHPなどのサーバー側環境で実行している場合は、正規表現が機能します。

次のようなもの:(] +>。?)

理由私が提案しているのは、他のものとは対照的に、コンテンツ全体を取得したいので、全体を括弧で囲んでください。TRとTDには幅がある場合とない場合があり、そのようなことを確認するのに害はありません。

。*?ほとんどの正規表現エンジンでは、構造は貪欲ではないはずなので、準拠する最小の文字列を一致させます。これにより、...が一致しないようにする必要があります。マルチラインと大文字と小文字の区別(通常はmとi)も設定する必要があります。(ただし、これはテストしていません)

しかし、ロバートが指摘しているように、サーバー側では、適切なHTMLパーサーの方が優れており、DOMまたはXML拡張機能のいずれかで処理できるはずです。

于 2010-11-25T11:37:34.410 に答える
-1

これは正規表現が行うことではありません。たとえば、テキストを<tr[^>]*>.*?<td[^>]*>.*?</tr>と一致させようとすると、<th>行と最初の<td>行が一致します。最初に行を照合してから、各行でを検索してみてください<td>

または、さらに良いことに、HTMLパーサーを使用します。HTMLは正規言語ではなく、正規表現で実際に解析することはできません。

于 2010-11-25T11:34:31.537 に答える