Regex для извлечения только TR с TD - PullRequest
1 голос
/ 25 ноября 2010

Доброе утро

Я пытаюсь получить строку таблицы (TR), которая должна иметь одну или несколько ячеек таблицы (TD):

Наличие этой строки

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

Каков наилучший шаблон для извлечения одного или нескольких TR с вложенными TD?

Ответы [ 4 ]

1 голос
/ 25 ноября 2010

Этот работает

Regex.Matches(sourceHtmlString, @"(?<1><TR[^>]*>\s*<td.*?</tr>)", 
              RegexOptions.Singleline | RegexOptions.IgnoreCase)
1 голос
/ 25 ноября 2010

<tr(\s[^>*)?>.*?<td(\s[^>]*)?>.*?</tr(\s[^>]*)?> должно работать, но с учетом регистра и многострочного флага.

Но я полностью согласен с комментарием Яна выше.Используйте html-анализатор, который будет намного более надежным и читабельным.

0 голосов
/ 25 ноября 2010

Где это работает, точно? Если вы запускаете это в браузере, в Javascript есть более эффективные способы, чем регулярные выражения (например, селекторы jQuery на tr: has (td) в качестве случайного примера)

Если вы работаете с серверной средой, например, PHP, регулярное выражение может работать.

Что-то вроде: (] +>.?)

Причина, по которой я предлагаю, в отличие от всего прочего - вы хотите получить весь контент, поэтому заключите все это в скобки, у TR и TD может быть или не быть ширина, никогда не повредит быть уверенным в таких вещах .

. *? конструкция в большинстве двигателей регулярных выражений не должна быть жадной, поэтому сопоставляйте наименьшую соответствующую строку - что должно помешать ... сопоставлению. Все равно потребуется многострочная и нечувствительность к регистру, обычно m и i, которые также должны быть установлены. (Я не проверял это, однако)

Но, как указывает Роберт, на стороне сервера правильный синтаксический анализатор HTML был бы лучше, либо расширения DOM, либо XML должны иметь с ним дело.

0 голосов
/ 25 ноября 2010

Это не то, что будут делать регулярные выражения.Например, попытка сопоставить ваш текст с <tr[^>]*>.*?<td[^>]*>.*?</tr> будет соответствовать строке <th> и первой строке <td>.Сначала вы должны сопоставить строки, а затем попытаться найти в каждой строке <td>.

Или, что еще лучше, использовать анализатор HTML.HTML не является обычным языком и не может быть проанализирован регулярным выражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...