Я конвертирую документы Word на ходу в HTML и нуждаюсь в анализе упомянутого HTML на основе разделителя. Например:
<div id="div1">
<p>
<font>
<b>[[delimiter]]Start of content section 1.</b>
</font>
</p>
<p>
<span>More content in section 1</span>
</p>
</div>
<div id="div2">
<p>
<b>
<font>[[delimiter]]Start of section 2</font>
</b>
<p>
<span>More content in section 2</span>
<p><font>[[delimiter]]Start of section 3</font></p>
<div>
<div id="div3">
<span><font>More content in section 3</font></span>
</div>
<!-- This continues on... -->
Следует проанализировать как:
Раздел 1:
<div id="div1">
<p>
<font>
<b>[[delimiter]]Start of content section 1.</b>
</font>
</p>
<p>
<span>More content in section 1</span>
</p>
</div>
Раздел 2:
<div id="div2">
<p>
<b>
<font>[[delimiter]]Start of section 2</font>
</b>
<p>
<span>More content in section 2</span>
<p></p>
<div>
Раздел 3:
<div id="div2">
<p>
<b>
</b>
<p>
<p><font>[[delimiter]]Start of section 3</font></p>
<div>
<div id="div3">
<span><font>More content in section 3</font></span>
</div>
-
Я не могу просто "взорвать" /срез на основе разделителя, потому что это нарушит HTML. Каждый бит текстового содержимого содержит много родительских элементов.
-
У меня нет контроля над структурой HTML, и она иногда изменяется в зависимости от структуры документа Word. Конечный пользователь импортирует свой документ Word для анализа в приложении, поэтому полученный HTML-код не будет изменен перед анализом.
-
Часто содержимое находится на разных глубинах в HTML.
-
Я не могу полагаться на классы элементов или идентификаторы, потому что они несовместимы с doc до doc. # div1, # div2 и # div3 предназначены только для иллюстрации в моем примере.
-
Моя цель состоит в том, чтобы разобрать содержимое, поэтому, если пустые элементы остались на этом ОК, я могу просто снова запустить разметку и удалить пустые теги (p, font, b и т.д.).
Мои попытки:
Я использую расширение PHP DOM для синтаксического разбора HTML и прокрутки узлов. Но я не могу придумать хороший алгоритм, чтобы понять это.
$doc = new \DOMDocument();
$doc->loadHTML($html);
$body = $doc->getElementsByTagName('body')->item(0);
foreach ($body->childNodes as $child) {
if ($child->hasChildNodes()) {
// Do recursive call...
} else {
// Contains slide identifier?
}
}