如何遍历DOMNodeList中的元素?

问题描述 投票:12回答:2

我在遍历DOMNodeList中的元素时遇到问题。我正在尝试将整个段落放在字符串中。我可以使用以下命令分别获得每个句子:

$node = $paragraph->item(0);  //first line of the paragraph
$node = $paragraph->item(1);  //second line of the paragraph

但是我似乎无法遍历所有句子并将它们放入一个字符串中。我已经尝试过了,但是没有用:

for($i=0; $i<3; $i++)
{
    $node = $paragraph->item($i); 
}

任何想法我该怎么做?

php loops dom
2个回答
18
投票

DOMNodeList实现Traversable,只需使用foreach()

foreach($nodeList as $node) {
  //...
}

当然也可以使用for。

$length = $nodeList->length;
for ($i = 0; $i < $length; $i++) {
  $node = $nodeList->item($i);
  //...
}

要获取节点内的所有文本内容,可以使用$ nodeValue或$ textContent属性:

$text = '';
foreach($nodeList as $node) {
  $text .= $node->textContent;
}

但这是用于节点列表的。您说这是一个段落的文本内容。如果您将段落作为DOMElement对象,则它也具有$ nodeValue和$ textContent属性。

$text = $paragraphNode->textContent;

并且如果您通过Xpath获取节点,则DOMXpath :: evaluate()可以将文本内容作为字符串返回。

$xpath = new DOMXpath($dom);
$text = $xpath->evaluate('string(//p[1])');

0
投票

我发现使用foreach()甚至对中等大小的DOMNodeList进行迭代都变得[[非常慢。一种更快的方法是在DOMNode $nextSibling循环中使用$nextSibling属性,如下所示:

do-while
© www.soinside.com 2019 - 2024. All rights reserved.