Изменить HTML с помощью Xpath и DomDocument? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть следующий источник HTML:

$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>";

Я хочу обновить все 1-е <td> в <tr>, чтобы добавить класс на <td>:

<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";

}

Однако я не знаю, как изменить содержимое, чтобы добавить мой класс.

У вас есть идеи?

1 Ответ

0 голосов
/ 12 декабря 2018

Вы можете просто использовать setAttribute, чтобы добавить класс к своим первым 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>

Демонстрация на 3v4l.org

...