Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用DOMDocumentFragment移动内部内容?_Php_Domdocument_Innerhtml - Fatal编程技术网

Php 如何使用DOMDocumentFragment移动内部内容?

Php 如何使用DOMDocumentFragment移动内部内容?,php,domdocument,innerhtml,Php,Domdocument,Innerhtml,我有一个可怕的算法,“删除一个节点”,将其内部内容移动到其父节点(见下文)。。。但是我认为可以使用(而不是使用saveXML/loadXML)开发更好的算法 以下算法的灵感来自 moveInner($dom->getElementById('b1'))的输出 Rosangela1,Maria2, 爱德华多 。。。 首次使用后,moveInner($dom->getElementById('root'))或moveInner($dom->getElementById('p1'))中没有任何更改

我有一个可怕的算法,“删除一个节点”,将其内部内容移动到其父节点(见下文)。。。但是我认为可以使用(而不是使用saveXML/loadXML)开发更好的算法

以下算法的灵感来自

moveInner($dom->getElementById('b1'))的输出

Rosangela1,Maria2, 爱德华多

。。。
首次使用后,
moveInner($dom->getElementById('root'))
moveInner($dom->getElementById('p1'))
中没有任何更改


PS:类似于“修剪标签”功能。

您可以尝试使用phpQuery执行此任务。它的语法类似于jquery。 像这样的东西
pq(“#b1”)->html(pq(“#b1”)->text()

链接到

当您在同一个文档中移动时,这实际上并不麻烦。您单独发布的代码已经有很多地方可以单独优化,例如,要将
子节点
节点列表
转换为数组,请使用:

您还应该使用更多的变量名,使用更长的变量名没有问题。它只是让代码更具可读性,并让您可以更快地查看更重要的内容:

/**
 * Move the content of the $from node to its parent node.
 *
 * @param DOMElement $from to be removed, preserving its contents.
 * @return DOMElement the element removed (w/o it's former children)
 * @throws InvalidArgumentException in case there is no parent element
 */
function moveInner(DOMElement $from)
{
    if (!$from->parentNode instanceof DOMElement) {
        throw new InvalidArgumentException(
            'DOMElement does not have a parent DOMElement node.'
        );
    }

    /** @var DOMNode[] $children */
    $children = iterator_to_array($from->childNodes);
    foreach ($children as $child) {
        $from->parentNode->insertBefore($child, $from);
    }

    return $from->parentNode->removeChild($from);
}
它只是工作。如果将同一元素插入DOMDocument中的另一个位置,则该元素将被移动,而不是复制

如果要复制(以便保留子节点,而不是移动它),可以将子节点用作原型,然后只克隆它们。当此函数返回被删除的元素时,它将包含副本

首先是示例w/o clone,只是上面的函数:

$removed = moveInner($doc->getElementById('b1'));

echo $doc->saveHTML(), "\nRemoved: ", $doc->saveHTML($removed);
输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html id="root"><body><p id="p1"><i>Title <b>2</b></i></p>
<p id="p2">Rosangela<sup>1</sup>, Maria<sup>2</sup>,
           <b>Eduardo<sup>4</sup></b>
</p>
</body></html>

Removed: <b id="b1"></b>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html id="root"><body><p id="p1"><i>Title <b>2</b></i></p>
<p id="p2">Rosangela<sup>1</sup>, Maria<sup>2</sup>,
           <b>Eduardo<sup>4</sup></b>
</p>
</body></html>

Removed: <b id="b1">Rosangela<sup>1</sup>, Maria<sup>2</sup></b>
输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html id="root"><body><p id="p1"><i>Title <b>2</b></i></p>
<p id="p2">Rosangela<sup>1</sup>, Maria<sup>2</sup>,
           <b>Eduardo<sup>4</sup></b>
</p>
</body></html>

Removed: <b id="b1"></b>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html id="root"><body><p id="p1"><i>Title <b>2</b></i></p>
<p id="p2">Rosangela<sup>1</sup>, Maria<sup>2</sup>,
           <b>Eduardo<sup>4</sup></b>
</p>
</body></html>

Removed: <b id="b1">Rosangela<sup>1</sup>, Maria<sup>2</sup></b>

标题2

马里兰州罗桑格拉1号, 爱德华多

移除:罗桑格拉1号,马里亚2号
我希望这是有益的,符合您的需要。这里确实有很多代码,可能有点被不同的替换节点场景误导了。同样在那个场景中,我修补了一些不同的错误代码,这些错误代码并不总是最好的代码基础

顺便说一句,这提醒了我一个问题,克隆人也很有帮助,我今天刚刚回答了这个问题:


感谢您提供phpQuery线索,但这不是答案:问题是关于编程。。。你能从phpQuery的库片段中提取出真正符合问题要求的内容吗?
$removed = moveInner($doc->getElementById('b1'));

echo $doc->saveHTML(), "\nRemoved: ", $doc->saveHTML($removed);
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html id="root"><body><p id="p1"><i>Title <b>2</b></i></p>
<p id="p2">Rosangela<sup>1</sup>, Maria<sup>2</sup>,
           <b>Eduardo<sup>4</sup></b>
</p>
</body></html>

Removed: <b id="b1"></b>
        $from->parentNode->insertBefore(clone $child, $from);
                                        #####
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html id="root"><body><p id="p1"><i>Title <b>2</b></i></p>
<p id="p2">Rosangela<sup>1</sup>, Maria<sup>2</sup>,
           <b>Eduardo<sup>4</sup></b>
</p>
</body></html>

Removed: <b id="b1">Rosangela<sup>1</sup>, Maria<sup>2</sup></b>