【发布时间】:2017-08-22 15:47:06
【问题描述】:
我正在将 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 中的不同深度。
我不能依赖元素类或 ID,因为它们在文档之间不一致。 #div1、#div2 和 #div3 在我的示例中仅用于说明。
我的目标是解析出内容,所以如果剩下空元素也没关系,我可以简单地再次运行标记并删除空标签(p、字体、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等)很简单,这就是您想要的内容。但是,您不能只说查找 anydiv,因为这是一个通用标签,甚至可能出现在其他div等内部。您始终必须为内容部分定义规则,如果您既不控制标记,又不能依赖它永不改变,这是不可能的。 -
为什么不使用
strip_tags然后将文本输出到某个模板<div><p>text</><p>text</p></div> -
为什么不使用类似这个库的东西:github.com/ATofighi/phpQuery
-
你能用 xhtml 生成 xpath 查询吗?
标签: php html parsing dom dom-manipulation