使用 Xpath 和 DomDocument 更改 HTML?

Change HTML using Xpath and DomDocument?

我有以下 HTML src :

$content = "<table>

<tr>
  <td>AAA</td>
  <td>30,40 €</td>
  <td>41,10 €</td>
</tr>
<tr>
  <td>BBB</td>
  <td>30,40 €</td>
  <td>41,10 €</td>
</tr>
<tr>
  <td>CCC</td>
  <td>30,40 €</td>
  <td>41,10 €</td>
</tr>
</table>";

我想更新 <tr> 中的所有第一个 <td>,在 <td> 上添加一个 class :

<table>

    <tr>
      <td class='first'>AAA</td>
      <td>30,40 €</td>
      <td>41,10 €</td>
    </tr>
    <tr>
      <td class='first'>BBB</td>
      <td>30,40 €</td>
      <td>41,10 €</td>
    </tr>
    <tr>
      <td class='first'>CCC</td>
      <td>30,40 €</td>
      <td>41,10 €</td>
    </tr>
    </table>

我可以用这个得到我想要的元素:

$dom = new DOMDocument();
@$dom->loadHTML($table);
$xpath = new DOMXPath($content);

foreach($xpath->query('//td[1]') as $td){
    echo $td->nodeValue."\n\n";

}

但是,我不知道如何更改内容以添加我的 class。

你有想法吗?

您可以只使用 setAttribute 将 class 添加到您的第一个 td 元素:

$doc = new DOMDocument();
$doc->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//td[1]') as $td) {
    $td->setAttribute('class', 'first');
}
echo $doc->saveHTML();

请注意,您需要转换 utf-8,因为 DOMDocument 不能很好地理解它。另外 DOMXPath 应该引用 DOMDocument,而不是原来的 HTML.

输出

<table>
 <tr>
  <td class="first">AAA</td>
  <td>30,40 &euro;</td>
  <td>41,10 &euro;</td>
 </tr>
 <tr>
  <td class="first">BBB</td>
  <td>30,40 &euro;</td>
  <td>41,10 &euro;</td>
 </tr>
 <tr>
  <td class="first">CCC</td>
  <td>30,40 &euro;</td>
  <td>41,10 &euro;</td>
 </tr> 
</table>

Demo on 3v4l.org