如果表单元格中满足条件,如何删除表行?-欢迎使用preg_replace或domdocument


How to remove table row if condition met in table cell? - preg_replace or domdocument are welcome

我的HTML表:

$table = <<< EOD
<table>
    <tbody>
        <tr style="border:none;">
            <td>1</td>
            <td>[[name_21]]</td>
            <td>[[charge_2]]</td>
        </tr>
        <tr style="border:1px solid #aaa;">
            <td>2</td>
            <td>[[name_13]]</td>
            <td>[[charge_5]]</td>
        </tr>
        <tr style="border:1px solid #ccc;">
            <td>3</td>
            <td>[[name_24]]</td>
            <td>[[charge_13]]</td>
        </tr>
        <tr style="border:1px solid #555;">
            <td>4</td>
            <td>[[name_22]]</td>
            <td>[[charge_22]]</td>
        </tr>
    </tbody>
</table>
EOD;

这就是我获取所有charge_X值的方法。

preg_match_all('/'['[charge_('d+)']']/', $table, $charge_ids);

删除单元格中包含charge_13的表行。

if (isset($charge_ids)) {
    if (array_key_exists('1', $charge_ids)) {
        $charge_ids = $charge_ids[1];
        $table_replaced = $table;
        foreach ($charge_ids as $charge_id) {
            if ($charge_id == '13') {
                // this line is removing table row if condition met in table cell.
                $table_replaced = preg_replace('/<tr[^>]*>('['[charge_'.$charge_id.'']'])<'/tr>/iUums', 'a', $table_replaced);
            }
        }
        echo $table_replaced;
    }
}

此代码仍然不起作用。如果表格单元格中有charge_13,如何删除表格行?

  • td中,可能仅包含charge_X带有文本的charge_X。例如:<td>[[charge_13]] USD</td>
  • charge_X值可能包含不同顺序的表格单元格。例如:<tr><td>3</td><td>[[charge_13]]</td><td>[[name_24]]</td></tr>
  • 表格单元格中可能存在unicode文本,例如中文或泰语字符
  • 欢迎使用preg_replace或DOMDocument

使用DOMDocument。

$table = <<< EOD
<table>
    <tbody>
        <tr style="border:none;">
            <td>1</td>
            <td>[[name_21]]</td>
            <td>[[charge_2]]</td>
        </tr>
        <tr style="border:1px solid #aaa;">
            <td>2</td>
            <td>[[name_13]]</td>
            <td>[[charge_5]]</td>
        </tr>
        <tr style="border:1px solid #ccc;">
            <td>3</td>
            <td>[[name_24]]</td>
            <td>[[charge_13]]</td>
        </tr>
        <tr style="border:1px solid #555;">
            <td>4</td>
            <td>[[name_22]]</td>
            <td>[[charge_22]]</td>
        </tr>
    </tbody>
</table>
EOD;
$dom = new 'DOMDocument();
$dom->loadHTML($table);
$xpath = new 'DOMXPath($dom);
// loop all <tr> element.
foreach ($xpath->query('//tr') as $tr) {
    $tds = $tr->getElementsByTagName('td');
    // get total <td> in this <tr>
    $total_item = $tds->length;
    // loop to all <td> and check.
    for ($i = 0; $i <= ($total_item-1); $i++) {
        // get table cell value.
        $table_cell_value = $tds->item($i)->nodeValue;
        preg_match('/'['[charge_('d+)']']/', $table_cell_value, $charge_id);
        // check if condition is met, the charge_id is 13.
        if (is_array($charge_id) && array_key_exists(1, $charge_id) && $charge_id[1] == 13) {
            // condition met. charge_id is 13. remove this table row.
            $tr->parentNode->removeChild($tr);
        }
        unset($charge_id, $table_cell_value);
    }
    unset($tds, $total_item);
}
// get the result
$saved_html = preg_replace('~<(?:!DOCTYPE|/?(?:html|body))[^>]*>'s*~i', '', $dom->saveHTML());
echo $saved_html;