我正在使用DOMDocument在HTML页面上检索一个特殊的div。
我只想在不使用div标签的情况下检索此div的内容。
例如:
$dom = new DOMDocument;
$dom->loadHTML($webtext['content']);
$main = $dom->getElementById('inter');
$dom->saveHTML()
在这里,我有结果:
<div id="inter">
//SOME THINGS IN MY DIV
</div>
我只想拥有:
//SOME THINGS IN MY DIV
想法?谢谢!
答案 0 :(得分:5)
我会用简单的方法去做。你已经拥有:
$dom = new DOMDocument;
$dom->loadHTML($webtext['content']);
$main = $dom->getElementById('inter');
$dom->saveHTML();
现在,DOMDocument::getElementById()
返回一个 DOMElement
,其中DOMNode
扩展为public string
nodeValue
。由于您没有指定除了div
内的文本之外是否还有任何文本,我将假设您希望任何可能以纯文本形式存储在其中的内容。为此,我们将删除$dom->saveHTML();
,而是将其替换为:
$divString = $main->nodeValue;
有了这个,$divString
将包含//SOME THINGS IN MY DIV
,从您的示例中,它是所需的输出。
但是,如果您想要其内部的HTML而不仅仅是String表示形式 - 请将其替换为以下内容:
$divString = "";
foreach($main->childNodes as $c)
$divString .= $c->ownerDocument->saveXML($c);
它的作用是利用包含DOMNode::childNodes
的继承DOMNodeList
,每个DOMDocument
包含自己的DOMNode(供参考,见上文),然后我们循环遍历每个ownerDocument
}这是DOMDocument::saveXML()
,我们称之为{{3}}函数。我们将当前$c
节点传递给函数的原因是为了防止输出整个有效文档,并且因为ownerDocument
是我们正在循环的 - 我们需要让一个孩子在时间,没有孩子留下。 (对不起,已经很晚了,无法抗拒。)
现在,在任一选项之后,您可以使用$divString
做什么。我希望这有助于向您解释这个过程,并希望您能够更好地了解正在发生的事情,而不是仅仅因为它起作用而对代码进行死记硬背。 ^^
答案 1 :(得分:0)
您可以使用xpath
$xpath = new DOMXPath($xml);
foreach($xpath->query('//div[@id="inter"]/*') as $node)
{
$node->nodeValue
}
或简单地说,你可以编辑你的代码。 see here
$main = $dom->getElementById('inter');
echo $main->nodeValue
答案 2 :(得分:0)
您可以使用我的自定义功能从内容中删除额外的div
$html_string = '<div id="inter">
SOME THINGS IN MY DIV
</div>';
//自定义功能
function DOMgetinnerHTML($element)
{
$innerHTML = "";
$children = $element->childNodes;
foreach ($children as $child)
{
$tmp_dom = new DOMDocument();
$tmp_dom->appendChild($tmp_dom->importNode($child, true));
$innerHTML.=trim($tmp_dom->saveHTML());
}
return $innerHTML;
}
你的代码会喜欢
$dom = new DOMDocument;
$dom->loadHTML($html_string);
$divs = $dom->getElementsByTagName('div');
$innerHTML_contents = DOMgetinnerHTML($divs->item(0));
echo $innerHTML_contents
,您的输出将
SOME THINGS IN MY DIV