PHP DOM - 解析包含特定 HTML 标签的文本节点

Posted

技术标签:

【中文标题】PHP DOM - 解析包含特定 HTML 标签的文本节点【英文标题】:PHP DOM - Parse text nodes that contain certain HTML tags 【发布时间】:2012-01-13 04:48:26 【问题描述】:

我最近在解析 html 文档中的所有文本节点时收到了帮助。结果代码是这样的:

$doc = new DOMDocument();
$doc->loadHTML($contents);
$doc->loadHTML("<p>not in the brackets..</p>");
$xpath = new DOMXPath($doc);
$textnodes = $xpath->evaluate('//text()');

使用以下摘录:

<p>This is a <b>nested <i>HTML</i> tag<b>...</p>

我可以创建一个元素数组:

Array
(
  [0] => This is a 
  [1] => nested
  [2] => HTML
  [3] => tag
  [4] => ...
)

不过,我实际上想做的是检索所有文本节点但允许“查看”某些 HTML 标记。例如,我不希望 &lt;i&gt;&lt;b&gt;&lt;u&gt; 标签被解析为单个节点;我宁愿他们加入到前一个文本节点上。理想情况下,上述数组应如下所示:

Array
(
  [0] => This is a nested HTML tag...
)

另一方面,&lt;p&gt; 标签应该被识别为单独的节点。所以下面的文字:

<p>paragraph 1 <b>here</b></p> <p>paragraph 2</b>

理想情况下会被解析为:

Array
(
  [0] => paragraph 1 <b>here</b>
  [1] => paragraph 2

我已经阅读了一些关于 XPath 和 php DOM 的文章,但老实说,我真的不知道如何去做。谁能指出我正确的方向?谢谢。

编辑

只是为了澄清输出必须是数组格式;我的目标是解析页面中的所有文本,然后可以在翻译文件中使用它。因此,某些 HTML 标记(&lt;b&gt; 等)在解析后的文本中是可取的,以便在新的翻译文件中保持完整的句子在一起 - 并保持标记大致完整。

【问题讨论】:

可能重复。请查看:***.com/questions/2442314/… @Calvin 除非我误解了那篇文章,否则问题与我问的不一样。 重复http://***.com/questions/2087103/innerhtml-in-phps-domdocument @pguardiario 再说一次,我不认为这是在问同样的事情吗?如果我可以使用答案来实现我的目标,我不知道如何。请进一步告知。 【参考方案1】:

考虑在“查看过的标签”上使用strip_tags,并在您想要实际分割的标签上使用允许标签的第二个参数。

【讨论】:

我无法使用strip_tags(),因为我需要将 HTML 标记中的文本作为数组检索。删除将用于“分隔”数组的标签只会使这样做变得更加困难。不过,也许我在问题中省略了一些信息,所以我现在将对其进行编辑。谢谢。【参考方案2】:

如果你有一个节点并且想要将它标准化为纯文本:

XPATH: 'string(thenode)'
DOM:   $thenode->textContent;

这将忽略所有不是文本节点的子节点并将其作为单个字符串返回。

因此,在您的示例中,像 string(//p) 这样的 xpath 将为您提供一个纯文本段落数组,其中所有元素都已删除。您可以使用getElementsByTagName() 对DOM 执行相同的操作,并为每个结果获取textContent 属性。

如果您有比这更复杂的需求,您最好使用带有身份转换的 XSL 来生成更符合您喜好的新 DOM 树。例如,如果你有一些你想要的***节点(比如&lt;p&gt;),并且想要去除一些但不是全部的子节点(例如,“保留emstrong,但折叠cite向上),那么 DOM 解决方案将是相当乏味的。

【讨论】:

以上是关于PHP DOM - 解析包含特定 HTML 标签的文本节点的主要内容,如果未能解决你的问题,请参考以下文章

php - 获取没有类或标签的文本html dom解析器

php解析HTML

PHP - 解析 HTML,选择标签,在所选标签内插入另一个 HTML 字符串

DHTML 动态HTML 包含HTML CSS JavaScript dom

JavaScript 中的 DOM 解析

xml基础知识