DomDocument获取所有div并放入一个数组

时间:2016-10-26 11:26:37

标签: php domdocument

我有一些div具有相同的Id和相同的Class,如下所示:

<div id="results_information" class="control_results">
<!-- I have divs, subDivs, span, images inside -->
</div>

<div id="results_information" class="control_results">
<!-- I have divs, subDivs, span, images inside -->
</div>

....

在我的情况下,我想将所有这些保存在一个数组中以便以后使用,我想以这种格式保存:

[0] => '<div id="results_information" class="control_results">
<!-- I have divs, subDivs, span, images inside -->
</div>',

[1] => '<div id="results_information" class="control_results">
<!-- I have divs, subDivs, span, images inside -->
</div>',

....

为此,我使用以下代码:

$dom = new DOMDocument(); // Create DOMDocument object.
$dom->loadHTMLFile($htmlOut); // Load target file.
$div =$dom->getElementById('results_information'); // Take all div elements.

但它不起作用,我如何解决这个问题并将我的div放在一个数组中?

2 个答案:

答案 0 :(得分:2)

要解决您的问题,您需要执行以下步骤:

首先,您应该选择$myRequest = new Request(); $myRequest->request->add(['foo' => 'bar']); var_dump($myRequest->foo); 而不是class(因为ID在这种情况下应该是唯一的。)

在这种情况下,我们假设您在名为id的变量中包含以下html:

$htmlOut

我们需要提取这两个名为<div id="results_information" class="control_results"> <span style="background:black; color:white"> hellow world </span> <strong>2</strong> </div> <div id="results_information" class="control_results"> <strong>2</strong> <img src="hello.png" /> </div> 的{​​{1}} {}}中存在的html并放入数组中,为此,我们需要使用classcontrol_results

DomDocument

使用该代码,我们可以使用classname DomXPath提取div的所有内容,并将其放入变量$array = array(); $dom = new DomDocument(); $dom->loadHtml($htmlOut); $finder = new DomXPath($dom); $classname = "control_results"; $nodes = $finder->query("//*[contains(@class, '$classname')]");

现在我们需要解析变量control_results(即一个数组)并提取该两个类的所有HTML。为此,我创建了一个处理函数:

$nodes

此函数将提取每个childNodes(类$nodes中的每个HTML代码)并返回。

现在你只需要为变量$ nodes创建一个foreach并调用该函数,如下所示:

function get_inner_html( $node ) { 
    $innerHTML= ''; 
    $children = $node->childNodes; 
    foreach ($children as $child) { 
        $innerHTML .= $child->ownerDocument->saveXML( $child ); 
    } 

    return $innerHTML;  
}  

以下是完整的代码:

control_results

但是这个代码有一点问题,如果检查数组中的结果是:

foreach ($nodes as $rowNode) {
    $array[] = get_inner_html($rowNode);
}

var_dump($array);

而不是:

$htmlOut = '
<div id="results_information" class="control_results">
<span style="background:black; color:white">
hellow world
</span>
<strong>2</strong>
</div>

<div id="results_information" class="control_results">
<strong>2</strong>
<img src="hello.png" />
</div>
';

$array = array();
$dom = new DomDocument();
$dom->loadHtml($htmlOut);
$finder = new DomXPath($dom);
$classname = "control_results";
$nodes = $finder->query("//*[contains(@class, '$classname')]");

foreach ($nodes as $rowNode) {
    $array[] = get_inner_html($rowNode);
}

var_dump($array);


function get_inner_html( $node ) { 
    $innerHTML= ''; 
    $children = $node->childNodes; 
    foreach ($children as $child) { 
        $innerHTML .= $child->ownerDocument->saveXML( $child ); 
    } 

    return $innerHTML;  
}  

在这种情况下,您可以执行此数组的foreach并在内容的init中包含该div,并在内容的最后一个中关闭该div并重新保存该数组。

答案 1 :(得分:1)

您需要使用xpath并使用类名获取元素。

$dom = new DOMDocument(); 
$xpath = new DOMXpath($dom);
$div = $xpath->query('//div[contains(@class, "control_results")]')