2013-06-01 7 views
1

Итак, у меня есть регулярное выражение, которое я пытаюсь использовать для соответствия определенному шаблону в некоторых файлах html. Вот preg_match заявление:PHP preg_match - соответствующие элементы html

preg_match('@<'.$htmlElementType.' id\s*=\s*"{{ALViewElement_'.$this->_elementId.'}}".*>[\s\S]*</'.$htmlElementType.'(>)@i', $htmlString, $newMatches, PREG_OFFSET_CAPTURE) 

Чтобы было ясно, это попытка сопоставить HTML-элемент с идентификатором {{ALViewElement _ *}.}, Но она также должна закончиться сама с закрывающим тегом, например, если $ htmlElementType был «секцией», и он заканчивался на «/ section>».

Если мой HTML выглядел так же, как это ни с чем-либо в нем, он работает, как ожидалось:

<section id="{{ALViewElement_resume}}"> 
      <!--{{RESUME_ADD_CHANGE_PIECE}}--> 
      <!--{{RESUME}}--> 
     </section> 

Проблема заключается в том, когда у нас есть раздел элемент позже в HTML, а также имеет закрывающий/раздел >. Пример:

<section id="{{ALViewElement_resume}}"> 
      <!--{{RESUME_ADD_CHANGE_PIECE}}--> 
      <!--{{RESUME}}--> 
     </section> 
     <div> 

     </div> 
     <section> 
      HEY THIS IS ME 
     </section> 

В этом случае полная машина - это все выше. Но я хочу, чтобы он остановился на том, что открывает мою первую. Это важно, потому что позже в моем коде мне нужно расположение последнего> в этом конечном теге.

Любые идеи, как я мог немного изменить это регулярное выражение?

Спасибо за помощь!

+0

** Не использовать регулярные выражения для разбора HTML **. Вы не можете достоверно разобрать HTML с регулярными выражениями, и вы столкнетесь с печалью и разочарованием в будущем. Как только HTML изменится с ваших ожиданий, ваш код будет сломан. См. Http://htmlparsing.com/php для примеров того, как правильно анализировать HTML с PHP-модулями, которые уже были написаны, протестированы и отлажены. –

ответ

2

Да, просто использовать ungreedy квантор:

preg_match('@<'.$htmlElementType.' id\s*=\s*"{{ALViewElement_'.$this->_elementId.'}}".*?>[\s\S]*?</'.$htmlElementType.'(>)@i', $htmlString, $newMatches, PREG_OFFSET_CAPTURE) 

другой путь: с DOMDocument:

$html = <<<LOD 
<section id="{{ALViewElement_resume}}"> 
     <!--{{RESUME_ADD_CHANGE_PIECE}}--> 
     <!--{{RESUME}}--> 
</section> 
<div> 

</div> 
<section> 
    HEY THIS IS ME 
</section> 
LOD; 
$doc= new DOMDocument(); 
@$doc->loadHTML($html); 
$node = $doc->getElementById("{{ALViewElement_resume}}"); 

$docv = new DOMDocument(); 
$docv->appendChild($docv->importNode($node, TRUE)); 
$result = $docv->saveHTML(); 
echo htmlspecialchars($result); 
+0

Awesome. Даже не знал, что такая вещь существует. Благодаря! – user1513171

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