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 标记。例如,我不希望 <i>
、<b>
和 <u>
标签被解析为单个节点;我宁愿他们加入到前一个文本节点上。理想情况下,上述数组应如下所示:
Array
(
[0] => This is a nested HTML tag...
)
另一方面,<p>
标签应该被识别为单独的节点。所以下面的文字:
<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 标记(<b>
等)在解析后的文本中是可取的,以便在新的翻译文件中保持完整的句子在一起 - 并保持标记大致完整。
【问题讨论】:
可能重复。请查看:***.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 树。例如,如果你有一些你想要的***节点(比如<p>
),并且想要去除一些但不是全部的子节点(例如,“保留em
和strong
,但折叠cite
向上),那么 DOM 解决方案将是相当乏味的。
【讨论】:
以上是关于PHP DOM - 解析包含特定 HTML 标签的文本节点的主要内容,如果未能解决你的问题,请参考以下文章
PHP - 解析 HTML,选择标签,在所选标签内插入另一个 HTML 字符串