3

Let's say I have the following string:

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

And I want to remove the spans but not the content.

$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

So that $var contains: This <b>is</b> an example.

So basically I have two questions:

  1. How to remove the spans
  2. How to save the stripped string to a variable
PeeHaa
  • 71,436
  • 58
  • 190
  • 262
  • possible duplicate of [PHP Dom Remove element leave contents](http://stackoverflow.com/questions/4675460/php-dom-remove-element-leave-contents) – netcoder May 01 '11 at 15:41

2 Answers2

6

Something like this should do the trick:

<?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"
lonesomeday
  • 233,373
  • 50
  • 316
  • 318
1

EDIT:

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

Or more simply:

echo strip_tags($content);
Artefacto
  • 96,375
  • 17
  • 202
  • 225