2010-11-25 7 views
1

Доброе утроRegex для извлечения только TR с TDs

Я пытаюсь получить строки таблицы (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> 

что будет лучший образец для извлечения одного или нескольких ТР с вложенными TDs ?

+2

'Ты не использовать регулярное выражение для разбора HTML'. Используйте некоторую библиотеку манипуляций DOM на своем языке. –

+0

@Jan Используется в C# для разбора строки HTML –

+0

См. Этот ответ http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454 –

ответ

1

Это один работает

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

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

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

+0

Это не сработает? 'Regex.Matches ("

Майкл Джексон Cramberries Pixies The Ramones
", @ " *)?>. *? ] *)?>. *?] *)?> ", RegexOptions.Multiline | RegexOptions.IgnoreCase)' –

-1

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

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

+0

Обычный язык не применим к современным регулярным выражениям и ни с чем с '(.) \ 1'. – tchrist

+0

Да,« современные »регулярные выражения могут соответствовать не только обычным языкам, но они по-прежнему неспособны обрабатывать нетривиальный HTML. – robert

0

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

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

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

Причины я предлагаю, что в отличие от всего остального - вы хотите, чтобы получить все содержимое, так обернуть всю вещь в скобках, ТР и ТД может быть или не иметь ширины, никогда не помешает быть уверенным в таких вещах.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^