2010-06-19 62 views
0

用例很简单。我想通过基本上包含HTML文档的字符串(!)中的xpath语句来查找节点并删除它们。如何使用xpath->查询从包含HTML文档的字符串中删除找到的节点用PHP

我知道如何用PHP找到节点。它基本上是这样的: 创建新的DOMDocument LoadHTML(或LoadXML) 创建新的DOMXpath,然后创建方法“query”或“evaluate”。完成。

但删除是棘手的部分。人们会认为你只需要用几条语句删除节点(并且在最后的parentNode-> removeChild处),然后将结果保存到带有saveHTML的字符串中。不幸的是,这个操作几乎每次都会在原始的HTML字符串中“转换太多东西”。

所以我现在的问题是。如何通过xpath-> query($ query)删除节点而不使用saveHTML或saveXML?而不用编写我自己的解析器。

希望它已经足够清楚:-)

感谢您看这个!

回答

0

首先,确保从底部开始删除找到的节点。这是为了确保您在父节点之前删除子节点。

二,你是什么意思“转化为很多东西”? PHP的DOM XML将把文档解析为DOM节点树。然后你在树上工作,当你完成时它会将DOM树转换回XML/HTML。你很可能会失去缩进,争论可能会改变地方等等。重要的是文档意味着完全相同的东西,即DOM树的确切的XML/HTML表示。

0

Emil thanks for your quick answer

是的,你说得对。这是我如何删除节点,它的工作原理:

使用loadHTML/loadXML将HTML STRING转换为DOM - >使用xpath查询节点 - >从DOM中删除节点(如您所述) - >将DOM转换为HTML STRING saveHTML/XML

工作原理 - 但问题是saveHTML后的输出通常会显着不同(除了已删除的节点)。我不关心论据定位或空白。但有时网站在saveHTML之后甚至无法在浏览器中正确呈现。我怀疑浏览器处理更好的不完美的HTML代码...

是否有另一种方式,我可以尝试 - 除了saveHTML?

可能是不可能的(或者至少不是没有很大的努力)?你怎么看?

+0

请使用'添加评论'功能来回答个别答案。 SO不能像论坛一样工作。如果您将评论作为新答案提供,答案的作者将不会收到通知。如果你使用评论功能,他会的。 – Gordon 2010-06-19 10:32:51

相关问题