【问题标题】:Removing child nodes from DOM table removing only alternate children从 DOM 表中删除子节点仅删除备用子节点
【发布时间】:2021-05-30 11:22:12
【问题描述】:

我正在使用 PHP,并且我有一个包含字符串的 HTML 字符串。我需要删除表的所有行(实际上,会有一些逻辑来检查是否删除该行,但现在我正在删除所有行)。

我正在尝试从表中删除所有行,但只有备用行被删除。

$html_string = <<<HTML
<div class="my-table-div">
   <div class="clear"></div>
   <div class="table-wrap">
      <table id="my-table" class="my-class">
         <thead>
            <tr>
               <th class="manage-column" scope="col">Col1</th>
               <th class="manage-column" scope="col">Col2</th>
               <th class="manage-column" scope="col">Col3</th>
               <th class="manage-column" scope="col">Col4</th>
               <th class="manage-column" scope="col">Col5;</th>
            </tr>
         </thead>
         <tbody>
            <tr>
               <td></td>
               <td>Item 1</td>
               <td></td>
               <td></td>
               <td></td>
            </tr>
            <tr>
               <td></td>
               <td>Item 2</td>
               <td></td>
               <td></td>
               <td></td>
            </tr>
            <tr>
               <td></td>
               <td>Item 3</td>
               <td></td>
               <td></td>
               <td></td>
            </tr>
            <tr>
               <td></td>
               <td>Item 4</td>
               <td></td>
               <td></td>
               <td></td>
            </tr>
         </tbody>
      </table>
   </div>
</div>
HTML

$doc = new DOMDocument();
$doc->loadHTML($html_string);
$table = $doc->getElementsByTagName('table')[0];
$trs = $table->getElementsByTagName('tr');
for( $x=1; $x<count($trs); $x++ ) {
      $trs[$x]->parentNode->removeChild($trs[$x]);
}

//var_dump($doc->saveHTML()); // to check output of the above code

执行上述操作后的实际结果:

Col1    Col2    Col3    Col4    Col5
        Item 2          
        Item 4

预期结果:

Col1    Col2    Col3    Col4    Col5

【问题讨论】:

    标签: php html dom


    【解决方案1】:

    你的问题在于理解这部分代码

    $trs[$x]->parentNode->removeChild($trs[$x]);
    

    当您以这种方式删除元素时,该元素将从 $trs 中删除,然后在索引中重新索引,例如外观和本示例

    elements
        1 -> sub element 1
        2 -> sub element 2
        3 -> sub element 3
    

    当你删除第一个时,它会是这样的

    elements
        1 -> sub element 2
        2 -> sub element 3
    

    现在您再次需要删除索引为 1 的元素
    所以你应该把这段代码改成这样

    $trs[1]->parentNode->removeChild($trs[1]);
    

    你的最终代码会是这样的

    $html_string = '
    <div class="my-table-div">
       <div class="clear"></div>
       <div class="table-wrap">
          <table id="my-table" class="my-class">
             <thead>
                <tr>
                   <th class="manage-column" scope="col">Col1</th>
                   <th class="manage-column" scope="col">Col2</th>
                   <th class="manage-column" scope="col">Col3</th>
                   <th class="manage-column" scope="col">Col4</th>
                   <th class="manage-column" scope="col">Col5;</th>
                </tr>
             </thead>
             <tbody>
                <tr>
                   <td></td>
                   <td>Item 1</td>
                   <td></td>
                   <td></td>
                   <td></td>
                </tr>
                <tr>
                   <td></td>
                   <td>Item 2</td>
                   <td></td>
                   <td></td>
                   <td></td>
                </tr>
                <tr>
                   <td></td>
                   <td>Item 3</td>
                   <td></td>
                   <td></td>
                   <td></td>
                </tr>
                <tr>
                   <td></td>
                   <td>Item 4</td>
                   <td></td>
                   <td></td>
                   <td></td>
                </tr>
             </tbody>
          </table>
       </div>
    </div>';
    
    $doc = new DOMDocument();
    $doc->loadHTML($html_string);
    $table = $doc->getElementsByTagName('table')[0];
    $trs = $table->getElementsByTagName('tr');
    $trCount = count($trs) - 1;
    for( $x=0; $x < $trCount; $x++ ) {
          $trs[1]->parentNode->removeChild($trs[1]);
    }
    
    print_r($doc->saveHTML());
    

    【讨论】:

    • 如果我的回答对您的问题有所帮助,如果您支持我的回答并将其选为您希望的最佳答案,我将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多