从DOM对象中删除范围但不删除内容并将其保存到变量中

时间:2011-05-01 15:18:05

标签: php dom html-parsing domdocument

假设我有以下字符串:

<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 <b>is</b> an example

基本上我有两个问题:

  1. 如何删除span s
  2. 如何将已剥离的字符串保存到变量

2 个答案:

答案 0 :(得分:5)

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

<?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"

答案 1 :(得分:1)

编辑:

<?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);