2015-03-28 3 views
0

Я пытаюсь создать preg_match, который находит серию тегов в HTML-документе.Найти конкретную комбинацию тегов HTML с preg_match

Пример HTML:

<div class="importantclass"> 
 
    <p>some thing</p> 
 
    <p>some more things</p> 
 
</div> 
 
<div class="importantclass"> 
 
    <b>some text</b> 
 
    <p>NEEDLE</p> 
 
</div>

Мне нужно найти сочетание тегов с классом ДИВ = «importantclass» и последующим р-тегом с определенным игольчатым текстом внутри.

Затем мне нужно вернуть позицию открытия класса div. Примечание: Я не хочу получать соответствие из-за первого появления div важного класса.

Есть ли возможность сделать это без использования DOM и просто с помощью regexp?

Спасибо за подсказки!

+4

и почему вы хотите использовать регулярное выражение для этого, когда вы знаете, что есть DOM, который является гораздо более адекватным инструментом для поиска узлов? Можете ли вы прояснить фактическое использование, например. что вы намереваетесь делать со смещением, если у вас есть это? – Gordon

+0

Я вижу, как этот ответ стал настолько популярным сейчас ... Вы не должны анализировать HTML с помощью Regex, как заявил Гордон, у вас есть отлично подходящий DOM с методом getElementsByTagName(), который вы можете выполнить итерацией. –

+0

Можете ли вы отправить образец желаемого результата? –

ответ

0

Это работает для вас?

<?php 
    $html = <<< LOB 
<div class="importantclass"> 
    <p>some thing</p> 
    <p>some more things</p> 
</div> 
<div class="importantclass"> 
    <b>some text</b> 
    <p>FIND ME</p> 
</div> 
LOB; 

    $needle = "FIND ME"; 
    preg_match_all('%(<div.*?class="importantclass">.*?</div>)%sim', $html, $matches, PREG_PATTERN_ORDER); 
    for ($i = 0; $i < count($matches[1]); $i++) { 
     if (preg_match("%<p>$needle</p>%im", $matches[1][$i])) { 
      echo "MATCH FOUND!<br>"; 
      echo "POSITION $i<br>"; 
      echo htmlentities($matches[1][$i]); 
     } 
} 

DEMO

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