Удаление диапазона из объекта DOM, но не содержимого, и сохранение его в переменной - PullRequest
3 голосов
/ 01 мая 2011

Допустим, у меня есть следующая строка:

<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 ]

5 голосов
/ 01 мая 2011

Примерно так должно получиться:

<?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 голос
/ 01 мая 2011

РЕДАКТИРОВАТЬ:

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