Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHPDOM获取元素长度_Php - Fatal编程技术网

使用PHPDOM获取元素长度

使用PHPDOM获取元素长度,php,Php,我受够了。 我尝试使用PHPDOM来解析一些html代码。 我怎样才能知道当前元素在for循环中迭代了多少子元素 <?php $str=' <table id="tableId"> <tr> <td>row1 cell1</td> <td>row1 cell2</td> </tr> <tr> <td>row2 cell1</td> <

我受够了。 我尝试使用PHPDOM来解析一些html代码。 我怎样才能知道当前元素在for循环中迭代了多少子元素

<?php
$str='
<table id="tableId">
<tr>
    <td>row1 cell1</td>
    <td>row1 cell2</td>
</tr>
<tr>
    <td>row2 cell1</td>
    <td>row2 cell2</td>
</tr>
</table>
';

$DOM = new DOMDocument;
$DOM->loadHTML($str);   // loading page contents
$table = $DOM->getElementById('tableId');   // getting the table that I need
$DOM->loadHTML($table);     

$tr = $DOM->getElementsByTagName('tr');     // getting rows

echo $tr->item(0)->nodeValue;   // outputs row1 cell1 row1 cell2 - exactly as I expect with both rows
echo "<br>";
echo $tr->item(1)->nodeValue;   // outputs row2 cell1 row2 cell2

// now I need to iterate through each row to build an array with cells that it has
for ($i = 0; $i < $tr->length; $i++)
{
echo $tr->item($i)->length;     // outputs no value. But how can I get it?
echo $i."<br />";
}
?>

这将为您提供:

。。。但是:它将包含带有空格等的
DOMText
节点(因此计数为4)。如果不一定需要长度,只想迭代所有节点,可以执行以下操作:

foreach($tr->item($i)->childNodes as $node){
    if($node instanceof DOMElement){
        var_dump($node->ownerDocument->saveXML($node));
    }
}
$x = new DOMXPath($DOM);
var_dump($x->evaluate('count(*)',$tr->item($i)));
foreach($x->query('*',$tr->item($i)) as $child){
    var_dump($child->nodeValue);
}
如果只需要一定长度的图元,可以执行以下操作:

foreach($tr->item($i)->childNodes as $node){
    if($node instanceof DOMElement){
        var_dump($node->ownerDocument->saveXML($node));
    }
}
$x = new DOMXPath($DOM);
var_dump($x->evaluate('count(*)',$tr->item($i)));
foreach($x->query('*',$tr->item($i)) as $child){
    var_dump($child->nodeValue);
}
你可以这样做:

foreach($tr->item($i)->childNodes as $node){
    if($node instanceof DOMElement){
        var_dump($node->ownerDocument->saveXML($node));
    }
}
$x = new DOMXPath($DOM);
var_dump($x->evaluate('count(*)',$tr->item($i)));
foreach($x->query('*',$tr->item($i)) as $child){
    var_dump($child->nodeValue);
}
通过
->childNodes
进行访问,我更喜欢简单的“数组构建”。请记住,您只需将
foreach
通过
DOMNodeList
作为数组,就可以省去很多麻烦

从表生成简单数组:

$DOM = new DOMDocument;
$DOM->loadHTML($str);   // loading page contents
$table = $DOM->getElementById('tableId'); 
$result = array();
foreach($table->childNodes as $row){
   if(strtolower($row->tagName) != 'tr') continue;
   $rowdata = array();
   foreach($row->childNodes as $cell){
       if(strtolower($cell->tagName) != 'td') continue;
       $rowdata[] = $cell->textContent;
   }
   $result[] = $rowdata;
}
var_dump($result);

可能的副本。同样的问题。你需要DOM来完成吗?否则我可以给你指路..DOMDocument::loadHTML接受一个html字符串,在你第二次调用它(这似乎毫无意义)时,你会传递一个domeElement。我对PHP DOM不太熟悉,但因为它是PHP,而且似乎你在处理对象/数组,你就不能应用类似
echo count($tr)
的东西。再说一次,这不是百分之百的问题,只是一个想法。@Greg:另一个问题。这是关于片段的&getElementById不起作用。这部分在这里起作用。例如,在第二段代码中,如果instanceof domeElement,则转储/保存XML节点。其他人会有什么?通过省略它们,我会错过一些东西吗?@sergio:DOMNode的实例(不是
DomeElements
的实例)包含大量未包含在元素(因此不是子节点)中的原始文本,例如随机空白(所有这些输入和选项卡通常在HTML中找到,以直观地格式化)。有关什么是
节点
,而不是
元素
的完整列表,请查看