我想使用XPath和PHP将节点的内容提取为字符串

时间:2010-09-13 13:29:20

标签: php dom xpath nodevalue

我有一个接受一般HTML文件和一般XPath表达式的函数。我想提取包含整个文本(包括HTML标记)的匹配节点的字符串。 这是一个简化的例子......

<?php
$inDocStg = "
    <html><body>
    <div>The best-laid<br> schemes o' <span>mice</span> an' men
        <img src='./mouse.gif'><br>
    </div>
    </body></html>
    ";

$xPathDom = new DOMDocument();
@$xPathDom->loadHTML( $inDocStg );
$xPath = new DOMXPath( $xPathDom );
$matches = $xPath->query( "//div" );
echo $matches->item(0)->nodeValue;
?>

这会产生(我正在查看生成的HTML源代码 - 而不是浏览器输出)......

The best-laid schemes o' mice an' men

(HTML标记已被删除)。

但我想要的是......

The best-laid<br> schemes o' <span>mice</span> an' men<img src='./mouse.gif'><br>

感谢。

3 个答案:

答案 0 :(得分:0)

如何包装输出<pre>标签echo "<pre>" . $matches->item(0)->nodeValue . "</pre>";

答案 1 :(得分:0)

尝试给这两个去吧!

1

echo $matches->item(0)->textContent;

2

echo $matches->item(0);

第一个返回此节点及其后代的文本内容,第二个尝试访问魔术方法__toString() ..根据DOMDocument的构建方式,它可能是您已经获得的值

答案 2 :(得分:0)

这将有效,但没有XPath;

$xPathDom = new DOMDocument();
$xPathDom->loadHTML( $inDocStg );
echo $xPathDom->saveXML($xPathDom->getElementsByTagName('div')->item(0));

$xPathDom = new DOMDocument();
$xPathDom->loadHTML( $inDocStg );
$xPathDom->getElementsByTagName('div')->item(0);
echo $xPathDom->saveHTML();