PHP DOM 文件复制整个 table 到一个新的 div
PHP DOM Document copy whole table into a new div
我从 jquery summernote 收到 HTML table 这样的
<div class="pasted">
<table class="table table-bordered" style="width: 100%;">
<tbody>
<tr>
<td>
item 1
</td>
</tr>
</tbody>
</table>
</div>
现在我想使用 PHP
转换成这个
<div class="pasted">
<div class="table-responsive">
<table class="table table-bordered table-summernote1">
<tbody>
<tr>
<td>
item 1
</td>
</tr>
</tbody>
</table>
</div>
</div>
这是我的PHP代码:
<?php
$dom = new DOMDocument();
$dom->loadHTML($text, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$b = $dom->getElementsByTagName('table');
foreach ( $b as $t )
{
if ( $t->hasAttributes() )
{
foreach ( $t->attributes as $attr )
{
$t->removeAttribute($attr->nodeName);
}
$t->removeAttribute("style");
$t->setAttribute('class', 'table table-bordered table-summernote1');
$responsive = $dom->createElement('div');
$t->insertBefore($responsive);
$responsive->setAttribute('class', 'table-responsive');
$frag = $t->cloneNode(true);
$responsive->appendChild($frag);
}
}
?>
PHP 代码不起作用。页面在 $responsive->appendChild($frag) 上挂起并且处理永远不会结束。
我也试过 preg_replace 但没用
foreach ( $b as $t )
{
if ( $t->hasAttributes() )
{
foreach ( $t->attributes as $attr )
{
$t->removeAttribute($attr->nodeName);
}
$t->removeAttribute("style");
}
}
$text = $dom->saveHTML();
$text = preg_replace('/<table>(.*)<\/table>/isum', '<div class="table-responsive"><table class="table table-bordered table-summernote1"></table></div>', $text);
它只会转换前 1 或 2 tables。如果有多个 tables,一个 table 进入另一个 table.
解决这个问题的更好方法是什么?
似乎反对将克隆的节点添加到您克隆的节点中。我已经更改了 $responsive
添加的方式(添加到 table 的父级)并在添加克隆之前删除 $t
节点。
foreach ( $b as $t )
{
if ( $t->hasAttributes() )
{
foreach ( $t->attributes as $attr )
{
$t->removeAttribute($attr->nodeName);
}
$t->removeAttribute("style");
$t->setAttribute('class', 'table table-bordered table-summernote1');
$responsive = $dom->createElement('div');
$t->parentNode->insertBefore($responsive, $t);
$responsive->setAttribute('class', 'table-responsive');
$frag = $t->cloneNode(true);
$t->parentNode->removeChild($t);
$responsive->appendChild($frag);
}
}
我从 jquery summernote 收到 HTML table 这样的
<div class="pasted">
<table class="table table-bordered" style="width: 100%;">
<tbody>
<tr>
<td>
item 1
</td>
</tr>
</tbody>
</table>
</div>
现在我想使用 PHP
转换成这个<div class="pasted">
<div class="table-responsive">
<table class="table table-bordered table-summernote1">
<tbody>
<tr>
<td>
item 1
</td>
</tr>
</tbody>
</table>
</div>
</div>
这是我的PHP代码:
<?php
$dom = new DOMDocument();
$dom->loadHTML($text, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$b = $dom->getElementsByTagName('table');
foreach ( $b as $t )
{
if ( $t->hasAttributes() )
{
foreach ( $t->attributes as $attr )
{
$t->removeAttribute($attr->nodeName);
}
$t->removeAttribute("style");
$t->setAttribute('class', 'table table-bordered table-summernote1');
$responsive = $dom->createElement('div');
$t->insertBefore($responsive);
$responsive->setAttribute('class', 'table-responsive');
$frag = $t->cloneNode(true);
$responsive->appendChild($frag);
}
}
?>
PHP 代码不起作用。页面在 $responsive->appendChild($frag) 上挂起并且处理永远不会结束。
我也试过 preg_replace 但没用
foreach ( $b as $t )
{
if ( $t->hasAttributes() )
{
foreach ( $t->attributes as $attr )
{
$t->removeAttribute($attr->nodeName);
}
$t->removeAttribute("style");
}
}
$text = $dom->saveHTML();
$text = preg_replace('/<table>(.*)<\/table>/isum', '<div class="table-responsive"><table class="table table-bordered table-summernote1"></table></div>', $text);
它只会转换前 1 或 2 tables。如果有多个 tables,一个 table 进入另一个 table.
解决这个问题的更好方法是什么?
似乎反对将克隆的节点添加到您克隆的节点中。我已经更改了 $responsive
添加的方式(添加到 table 的父级)并在添加克隆之前删除 $t
节点。
foreach ( $b as $t )
{
if ( $t->hasAttributes() )
{
foreach ( $t->attributes as $attr )
{
$t->removeAttribute($attr->nodeName);
}
$t->removeAttribute("style");
$t->setAttribute('class', 'table table-bordered table-summernote1');
$responsive = $dom->createElement('div');
$t->parentNode->insertBefore($responsive, $t);
$responsive->setAttribute('class', 'table-responsive');
$frag = $t->cloneNode(true);
$t->parentNode->removeChild($t);
$responsive->appendChild($frag);
}
}