我正在将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... -->
应当解析为:
第一部分:
<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></p>
<div>
第三节:
<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>
我不能简单地根据分隔符“explode”/slice,因为那会破坏HTML。每个文本内容都有许多父元素。
我无法控制HTML结构,有时它会根据Word文档的结构而更改。最终用户将导入他们的Word文档到应用程序中进行解析,因此在解析之前不会修改生成的HTML。
通常内容位于HTML的不同深度。
我不能依赖元素类或ID,因为它们在文档之间不一致。#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?
}
}
div
,例如通过ID。如果你可以依赖于它,那么很容易获取特定ID(例如#div1
、#div2
等)的开标签和闭标签之间的所有内容,这就是你想要的内容。然而,你不能只是查找任何div
,因为那是一个通用标签,甚至可能出现在其他div
中等。你总是必须为内容的部分定义规则,如果你既不控制标记,也不能依赖于它永远不变,那是不可能的。 - Andystrip_tags
然后将文本输出到某个模板<div><p>text</><p>text</p></div>
? - vadim_hr