2015-08-19 2 views
0

У меня есть эта следующая структура HTML файла:найти шаблон регулярного выражения не предваряется то

<table> 
    <tr class="heading"> 
     <td colspan="2"> 
     <h2 class="groupheader">Public Types</h2> 
     <!-- I don't want that! We're in a table.--> 
     </td> 
    </tr> 
    <tr>...</tr> 
</table> 
<h2 class="groupheader">Detailed Description</h2> 
    <!-- I want all that until the next h2--> 
    <div class="textblock"><p>Provides the functions to control the generation of a single data log file. </p> 
    <h4>Example</h4> 
    <div class="fragment"><div class="line">Test <a href="aaa">stuff</a>();</div> 
     <div class="line">...</div>  
     <div class="line">...</div> 
    </div> 
</div> <!-- end of first result --> 

<h2 class="groupheader">Member</h2> 
<!-- I want all that until the next h2 or hr--> 
<a class="anchor"></a> 
<div class="memitem"> 
<div class="memproto"> 
     <table class="memname"> 
     <tr> 
      <td class="memname">enum <a class="el" href="...">test</a></td> 
     </tr> 
     </table> 
</div><div class="memdoc"> 
<hr><!-- End of 2nd result --> 

И с Regexp, мне нужно, чтобы получить все содержимое между каждыми названиями до следующего заголовка или часа тега, ожидайте, если он находится в таблице.

До сих пор у меня было все мое h2-> h2 | hr. Это выглядит так:

(?s)(<h2 class="groupheader">.*?)(<h2|<hr) 

Как я могу пропустить содержимое под H2, которое содержится в таблице? Я пробовал noodling с негативным взглядом позади, но я никуда не денусь.

Благодарим за помощь.

+1

Кажется, у вас есть опечатки, которые мешают мне понять вопрос, не могли бы вы исправить их? Может быть, предоставить некоторые образцы данных и выборки? –

+0

что вам нужно, чтобы точно, не поняли, добавьте пример, пожалуйста и как это не получается –

+0

Я попытался прояснить свою проблему. Надеюсь, это лучше! – Flag

ответ

1

ВНИМАНИЕ, ЧТО HTML ДОЛЖЕН быть разобран С СООТВЕТСТВУЮЩЕЙ PARSER

Теперь, так как мы остались только с HTML-ищет вход, и задача

, чтобы получить все содержимое между каждыми названиями до следующего заголовка или hr-тега, ожидайте, если он находится в таблице

Позвольте мне показать, как это можно сделать.

Вы можете получить подстроки, нужно с помощью tempered greedy token((?:(?!<\/table|<h2|<hr)(?:<table\b[^<]*>.*?<\/table>|.))*) (который соответствует любому символу, который не начиная любой из альтернатив отрицательного предпросмотра перед ним - таким образом, сохраняя матч в рамках <table> границ - а также соответствие внутренних таблиц) с положительной упреждающей выборкой в ​​конце:

(?s)<h2 class="groupheader">[^<]*<\/h2>\s*((?:(?!<\/table|<h2|<hr)(?:<table\b[^<]*>.*?<\/table>|.))*)(?=<h2|<hr) 

См demo.

Обратите внимание, что вместо h2 вы можете использовать h\d+ для поддержки любого уровня h.

+0

Спасибо за ввод, который заботится о секции h2, которая находится в таблице, но я потерял h2 это не в таблице. Я обновил свой образец, чтобы добавить случай. Это грубо ... – Flag

+0

Пожалуйста, проверьте мое обновление. Это некрасиво, но оно должно работать, если теги таблицы не утеряны. –