2

我有以下通过 php 脚本生成的 HTML 代码:

<table>
  <tr>
    <td><strong>Color</strong></td>
    <td></td>
  </tr>
  <tr>
    <td><strong>Size</strong></td>
    <td>10</td>
  </tr>
</table>

如果每行的第二个单元格为空,则删除该行,结果将是:

<table>
  <tr>
    <td><strong>Size</strong></td>
    <td>10</td>
  </tr>
</table>

是否有可能做到这一点?

4

2 回答 2

2

您不必使用正则表达式(假设您想修改从外部源加载的 HTML),可以使用DOM执行此操作:

<?php
$html = '<html><body><table>
  <tr>
    <td><strong>Color</strong></td>
    <td></td>
  </tr>
  <tr>
    <td><strong>Size</strong></td>
    <td>10</td>
  </tr>
</table></html>';

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);

foreach( $xpath->query('//table/tr') as $tr){
    $tds = $tr->getElementsByTagName('td');
    // You should check whether <tr> has two <td>s or is it error

    echo $tds->item(0)->nodeValue . " = " . $tds->item(1)->nodeValue . "<br/>";

    if( !$tds->item(1)->nodeValue){
        $tr->parentNode->removeChild($tr);
    }
}

echo "<pre>" . htmlspecialchars($dom->saveHTML()) . "</pre>";

工作小提琴示例。或者你可以使用更复杂一点xPath,做得更优雅:

foreach( $xpath->query('//table/tr[td[2][not(text())]]') as $tr){
    $tr->parentNode->removeChild($tr);
}
于 2013-04-29T15:17:30.620 回答
1

试试这个代码:

<table>
<?php if($color){ ?>
  <tr>
    <td><strong>Color</strong></td>
    <td><?php echo $color ?></td>
  </tr>
<?php } ?>
<?php if($size){ ?>
  <tr>
    <td><strong>Size</strong></td>
    <td><?php echo $size ?></td>
  </tr>
<?php } ?>
</table>
于 2013-04-29T15:10:26.033 回答