使用 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 €</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>
我有以下 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 €</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>