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

问题描述:

我最近从HTML文档解析所有文本节点时收到了帮助。生成的代码是这样的:PHP DOM - 解析包含特定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>等)因此在解析的文本中是合乎需要的,以便在新的翻译文件中保留完整的句子并保持标记大致完整。

+0

可能的重复。请检查了这一点:http://*.com/questions/2442314/php-simplexml-remove-xpath-node –

+0

@Calvin除非我误解了那篇文章,问题不是问我同样的事情。 – Pete171

+0

重复的[http://*.com/questions/2087103/innerhtml-in-phps-domdocument](http://*.com/questions/2087103/innerhtml-in-phps-domdocument) – pguardiario

考虑使用strip_tags上的'翻看标签',并使用允许标签的第二个参数在你想要实际分割的标签上。

+0

我无法使用'strip_tags()',因为我需要将HTML标记中的文本作为数组进行检索。删除用于“分隔”阵列的标签只会使得难以做到这一点。但是,也许我在我的问题中省略了一些信息,所以我现在编辑它。谢谢。 – Pete171

如果你有一个节点,并希望将其归为纯文本:

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

这将忽略不属于文本节点的所有子节点并返回一个字符串。

因此,在您的示例中,像string(//p)这样的xpath将为您提供一个纯文本段落数组,其中删除了所有元素。您可以使用getElementsByTagName()并为每个结果提取textContent属性来为DOM做同样的事情。

如果您的需求比这更复杂,那么使用带有标识转换的XSL来生成更符合您的喜好的新DOM树可能会更好。例如,如果你有一些你想要的*节点(如<p>),并且想要去掉一些但不是所有的子节点(例如,“保留emstrong,但折叠cite”),那么DOM解决方案将会相当乏味