我有一个<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扩展的解决方案都可以使用。
答案 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
?>