如何选择dom中2个不同标签之间的文本?

时间:2013-12-28 08:30:44

标签: php dom domdocument querypath

我有一个<p>标记,其中包含由<br>标记分隔的文字,如下所示:

<p>
    <small>Some text here</small>
    This is the text that want to remove
    <br> another text here
    <br> more text here
    <br> also there are other tags like <em>this one</em>
</p>

我要选择的元素位于第一个<br>标记之后,直到结束,我正在使用QueryPath库,我只获取html标记和它们之间的文本并且没有得到没有被标签包围的其他文本。

例如,我只使用此代码获取<br>代码和<em></em>代码:

$qp->find('div > p')->children('br')->eq(0)->nextAll();

因此,我尝试获取整个<p>代码并尝试从<small>代码中删除元素,直到第一个<br>代码:

// remove the text after the small tag
$qp->branch('div > p')->children('small')->textAfter(''); // didn't work

// although when I return the textAfter I get the text
// so setting it to an empty string didn't work

// I can only remove the small tag
$qp->branch('div > p')->children('small')->remove();

QueryPath库是Dom原生扩展之上的包装器,因此任何使用Dom扩展的解决方案都可以使用。

1 个答案:

答案 0 :(得分:1)

用于选择节点的QueryPath方法(例如nextAll()children())仅返回ElementNodes,但<br/> - 元素之间的节点是TextNodes。

使用DOMNode的nextSibling - 属性来选择TextNodes。

示例(使用本机DOM):

<?php
$dom = new DOMDocument();

$dom->loadXML('<p>
    <small>Some text here</small>
    This is the text that want to remove
    <br/> another text here
    <br/> more text here
    <br/> also there are other tags like <em>this one</em>
</p>');
$text='';
$node = $dom->getElementsByTagName('br')->item(0);
while($node->nextSibling){
  $node=$node->nextSibling;
  $text.=$node->textContent;
}
echo $text;
//output:
//another text here more text here also there are other tags like this one 
?>