PHP DOMDocument,只检索div的内容,不带div标记

PHP DOMDocument,只检索div的内容,不带div标记,php,domdocument,Php,Domdocument,我使用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 </

我使用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>
想法?谢谢

您可以使用

或者Simlu,您可以编辑代码

你可以用

或者Simlu,您可以编辑代码


您可以使用my custom函数从内容中删除额外的div

    $html_string = '<div id="inter">
        SOME THINGS IN MY DIV
    </div>';
你的代码会像

$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

您可以使用my custom函数从内容中删除额外的div

    $html_string = '<div id="inter">
        SOME THINGS IN MY DIV
    </div>';
你的代码会像

$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

我要用simple来做。您已经拥有:

$dom = new DOMDocument;
$dom->loadHTML($webtext['content']);
$main = $dom->getElementById('inter');
$dom->saveHTML();
现在,返回一个one,它扩展了
公共字符串
nodeValue
。由于您没有指定在该
div
中是否需要除文本以外的任何内容,因此我假设您需要可以以纯文本形式存储在其中的任何内容。为此,我们将删除
$dom->saveHTML(),并替换为:

$divString = $main->nodeValue;
这样,
$divString
将包含
//我的DIV
中的一些内容,根据您的示例,这是所需的输出

但是,如果您想要它内部的HTML,而不仅仅是字符串表示形式,请将其替换为以下内容:

$divString = "";
foreach($main->childNodes as $c) 
    $divString .= $c->ownerDocument->saveXML($c);
这样做的目的是利用继承的,它包含一个包含其自己的DOMNode(参考,请参见上文),我们循环遍历每个包含其自己DOMNode的DOMNode,得到
ownerDocument
,这是一个函数,我们调用该函数。我们将当前的
$c
节点传递给函数的原因是为了防止输出整个有效文档,并且因为
ownerDocument
是我们正在循环的内容-我们需要一次获得一个子文档,不留下任何子文档。(对不起,已经很晚了,忍不住。)


现在,在任何一个选项之后,您都可以使用
$divString
执行您想要执行的操作。我希望这有助于向您解释这个过程,并且希望您能够更好地理解正在发生的事情,而不是仅仅因为代码可以工作就死记硬背地复制代码^^

我要用simple来做。您已经拥有:

$dom = new DOMDocument;
$dom->loadHTML($webtext['content']);
$main = $dom->getElementById('inter');
$dom->saveHTML();
现在,返回一个one,它扩展了
公共字符串
nodeValue
。由于您没有指定在该
div
中是否需要除文本以外的任何内容,因此我假设您需要可以以纯文本形式存储在其中的任何内容。为此,我们将删除
$dom->saveHTML(),并替换为:

$divString = $main->nodeValue;
这样,
$divString
将包含
//我的DIV
中的一些内容,根据您的示例,这是所需的输出

但是,如果您想要它内部的HTML,而不仅仅是字符串表示形式,请将其替换为以下内容:

$divString = "";
foreach($main->childNodes as $c) 
    $divString .= $c->ownerDocument->saveXML($c);
这样做的目的是利用继承的,它包含一个包含其自己的DOMNode(参考,请参见上文),我们循环遍历每个包含其自己DOMNode的DOMNode,得到
ownerDocument
,这是一个函数,我们调用该函数。我们将当前的
$c
节点传递给函数的原因是为了防止输出整个有效文档,并且因为
ownerDocument
是我们正在循环的内容-我们需要一次获得一个子文档,不留下任何子文档。(对不起,已经很晚了,忍不住。)


现在,在任何一个选项之后,您都可以使用
$divString
执行您想要执行的操作。我希望这有助于向您解释这个过程,并且希望您能够更好地理解正在发生的事情,而不是仅仅因为代码可以工作就死记硬背地复制代码^^

阅读手册:阅读手册:只想指出您的第二个代码块不工作<代码>$main
将在该点上成为一个,并且无法迭代。我欢迎您尝试它,即使您将
$node->nodeValue
分配给该循环中的某个对象,也没有任何内容,循环永远不会运行。=]请阅读以供参考,如果您使用,这将工作,因为它提供了一个新的解决方案^^是的,你是对的。。但关键是在我们的例子中,$main将有一个值,那么为什么您不能迭代它?由于没有可迭代的内容,
DOMNode
不像单个标记在
GetElementsByTagName
^^中那样作为单个项数组,只想指出第二个代码块不起作用<代码>$main
将在该点上成为一个,并且无法迭代。我欢迎您尝试它,即使您将
$node->nodeValue
分配给该循环中的某个对象,也没有任何内容,循环永远不会运行。=]请阅读以供参考,如果您使用,这将工作,因为它提供了一个新的解决方案^^是的,你是对的。。但关键是在我们的例子中,$main将有一个值,那么为什么您不能迭代它?由于没有可迭代的内容,
DOMNode
不像单个标记在
GetElementsByTagName
^^中那样作为单个项数组,除非它不是您的函数,而是您从中获得的,当您从其他地方为一行复制函数行时,不要声明某个内容是您的。除非它不是您的函数,当您从其他地方复制一行一行的函数行时,您可以从“不要声明某些内容是您的”中获得它。我刚刚用saveXML()尝试了这一点,但它仍然包含我的元素:(@bluppfisk是的,它会的,正如它打算做的那样。如果你不这样做,请重新阅读答案以获得你想要的输出。^^对不起,我说得不太清楚。我的意思是我在做$dom->getElementById('span'))当我使用savedXML时,发现“span”元素本身仍然包含在其中。我确实希望保留所有其他HTML,因此nodeValue不是选项,而是标记。我该如何剥离它?我刚刚用saveXML()尝试了这个方法,但它仍然包含我的元素