我有一些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放在一个数组中?
答案 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并放入数组中,为此,我们需要使用class
和control_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")]')