gpt4 book ai didi

php - 使用DOMDocument在现有HTML表中创建新列

转载 作者:行者123 更新时间:2023-12-03 16:24:09 25 4
gpt4 key购买 nike

尝试使用DOMDocument和DOMXpath在现有表中创建新列

$doc = new DOMDocument();
$doc->loadHTMLFile("example.html");


这是位于 example.html中的表的结构:

<table id="transactions" class="table">
<thead>
<tr>
<th class="image"></th>
<th class="title"><span>Title</span></th>
</tr>
</thead>
<tbody>
<tr id="tbody-tr">
<td class="image">
<img src="http://www.example.com/image.jpg">
</td>
<td class="title">Title
</td>
<td class="date">12/16/2017
</td>
</tr>
<tr id="tbody-tr">
<td class="image">
<img src="http://www.example.com/image.jpg">
</td>
<td class="title">Title
</td>
<td class="date">12/16/2017
</td>
</tr>
</tbody>
</table>


在这种情况下,该表的xpath查询将是

$table =  $xpath->query('//*[@id="transactions"]');


对于 <tr id="tbody-tr">元素

$tr = $xpath->query('/*[@id="tbody-tr"]');


对于 <td>行元素-/ td [1] / td [2] / td [3]

$td = $xpath->query('//*[@id="tbody-tr"]/td[3]');


我正在尝试为 <td class="example"></td>的所有实例在 <td class="title"><td class="date">之间创建一个附加列( <tr id="tbody-tr">)(大约有50个,但为问题而缩小了)。

我是DOMDocument和HTML解析操作的新手,在试图弄清楚如何做到这一点方面真是费了点时间。

我假设我要么必须使用我的 xpath->query循环它,例如

foreach ($ttrows as $row) {
$td = $doc->createElement('td');
$parent = $row->parentNode;
$parent->appendChild($row);
$td->setAttribute('class','example');
}


或使用DOMDocuments getElementById或类似的东西。

foreach ($table = $doc->getElementById('tbody-tr') as $table) {
$td = $doc->createElement('td');
$td->setAttribute('class', 'example');
$td->appendChild($table);
$table->insertBefore($td, $table);
}


就像我说的那样,我是DOMDocument的新手,所以这两个示例几乎都不起作用。.但是我认为我朝着正确的方向前进(我希望)。

我认为,该表的结构相当好,可以在DOMDocument中进行此类操作。有人可以对此进行说明吗,我的尝试和错误使我收效甚微。

解:

foreach ($td as $row) {
$td = $doc->createElement('td', 'text to be inserted');
$td->setAttribute('class','example');
$row->parentNode->insertBefore($td, $row);
}


注意上面

$td = $xpath->query('//*[@id="tbody-tr"]/td[3]');


是第三个 <td>date

最佳答案

请记住,您不能/不应该在同一页面上有多个ID。

然后只需使用$tr->insertBefore($td, $tr->childNodes->item(3));

这意味着,当前节点在第3个td之前插入新的dom节点。

<?php
foreach ($doc->getElementsByTagName('tr') as $tr) {
$td = $doc->createElement('td');
$td->setAttribute('class', 'example');

$tr->insertBefore($td, $tr->childNodes->item(3));
}


https://3v4l.org/TthE7

另外要考虑的是添加 thead > th,否则将破坏表的外观。

foreach ($doc->getElementsByTagName('tr') as $tr) {

// insert into thead > th
if ($tr->childNodes->item(0)->nodeName == 'th') {
$th = $doc->createElement('th');
$th->setAttribute('class', 'example');
$th->nodeValue = 'Example';
$tr->insertBefore($th, $tr->childNodes->item(3));
}
// insert into body > td
else {
$td = $doc->createElement('td');
$td->setAttribute('class', 'example');

$tr->insertBefore($td, $tr->childNodes->item(3));
}
}


https://3v4l.org/1sj7s

关于php - 使用DOMDocument在现有HTML表中创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47848411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com