从 DOM 对象中删除跨度而不是内容并将其保存到变量中

Posted

技术标签:

【中文标题】从 DOM 对象中删除跨度而不是内容并将其保存到变量中【英文标题】:Removing a span from a DOM object but not the content and save it to a variable 【发布时间】:2011-08-16 11:53:03 【问题描述】:

假设我有以下字符串:

<span>This <b>is</b> an <span class="something">example</span></span>

我想删除跨度而不是内容。

$content = '<span>This <b>is</b> an <span class="something">example</span></span>';

$dom = new DOMDocument();
$dom->loadXML($content);

$nodes = $dom->getElementsByTagName('span');
foreach ($nodes as $node) 
    // remove span but not content


$dom->save($var); // $dom->save() saves to file but I want to save to $var

所以$var 包含:This &lt;b&gt;is&lt;/b&gt; an example

所以基本上我有两个问题:

    如何删除spans 如何将剥离的字符串保存到变量中

【问题讨论】:

php Dom Remove element leave contents的可能重复 【参考方案1】:

这样的事情应该可以解决问题:

<?php

function removeTag($content, $tagName) 
    $dom = new DOMDocument();
    $dom->loadXML($content);

    $nodes = $dom->getElementsByTagName($tagName);

    while ($node = $nodes->item(0)) 
        $replacement = $dom->createDocumentFragment();
        while ($inner = $node->childNodes->item(0)) 
            $replacement->appendChild($inner);
        
        $node->parentNode->replaceChild($replacement, $node);
    

    return $dom->savehtml();


$content = '<span>This <b>is</b> an <span>example</span></span>';

echo removeTag($content, 'span'); // echos "This <b>is</b> an example"

【讨论】:

【参考方案2】:

编辑:

<?php
$content = '<span><h1><span>This <b>is</b> an <span>example</span></span></h1></span>';

$dom = new DOMDocument();
$dom->loadXML($content);

for ($node = $dom->getElementsByTagName('span')->item(0);
    $node !== null;
    $node = $dom->getElementsByTagName('span')->item(0)) 
    // merge into parent
    $parent = $node->parentNode;
    $parent->removeChild($node);
    for ($el = $node->firstChild; $el !== null; $el = $el->nextSibling) 
        $parent->appendChild($el->cloneNode(true));
    


echo $dom->saveHTML();

    <?php
$content = '<span>This is an <span>example</span></span>';

$dom = new DOMDocument();
$dom->loadXML($content);

echo $dom->documentElement->textContent;

或者更简单地说:

echo strip_tags($content);

【讨论】:

我只想剥离跨度标签而不是所有标签。抱歉,如果我的问题不清楚。 经过测试,这也有效。谢谢!虽然 answer tick 会去 lonesomeday's answer。

以上是关于从 DOM 对象中删除跨度而不是内容并将其保存到变量中的主要内容,如果未能解决你的问题,请参考以下文章

使用文件的内容而不用 express.js 保存文件?

使用 CoreData 而不是仅仅通过 get 请求获取数据并将其保存在局部变量中的原因

PHP 通过 id 从跨度中获取文本/值并将其放入具有 cURL 的外部站点的变量中

从 DOM 中分离对象内容,添加其他内容,然后附加到 DOM

将对象检测模型嵌入 iOS 应用程序,并将其部署在 UIView 的内容而不是相机流上?

如何序列化对象并将其保存到 Android 中的文件中?