Domdocument найти и вставить - PullRequest
1 голос
/ 06 марта 2012

ОК, вот HTML-контент, который у меня есть:

<p> .... </p>
<div id="quick_preview">
<p>the contents </p>
</div>

и что я хочу:

<p> .... </p>
<div id="quick_preview">
<description>
  <p>the contents </p>
</description>
</div>

я использую эту процедуру, чтобы найти div и создатьdescription, но я не знаю, как вставить <description> в div до p:

$dom = new DOMDocument;
$dom->formatOutput = true;
$dom->preserveWhiteSpace = false;
$dom->loadHTML($row['body']);
$divs = $dom->getElementsByTagName('div');
foreach($divs as $div)
{
    if ($div->getAttribute( "id" ) == 'quick_preview') {
        $desc_element = $dom->createElement('description');
    }
}
$dom->saveHTMLFile($html)

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Это будет делать то, что вы хотите:

$dom = new DOMDocument;
$dom->formatOutput = true;
$dom->preserveWhiteSpace = false;
$dom->loadHTML($row['body']);

$xpath = new DOMXPath($dom);

$divs = $xpath->query('//div[@id="quick_preview"]');
foreach ($divs as $div)
{
    $description = $dom->createElement('description');
    while ( $div->hasChildNodes() )
    {
        $description->appendChild($div->firstChild);
    }
    $div->appendChild($description);
}

$dom->saveHTMLFile($html);

Вы можете отбросить XPath и использовать вместо него $dom->getElementById('quick_preview').

Обратите внимание, что вы можете перемещать узлы DOM, просто добавляя их в другое местов документе.

1 голос
/ 06 марта 2012

Ответ:

$dom = new DOMDocument;
$dom->formatOutput = true;
$dom->preserveWhiteSpace = false;
$dom->loadHTML($row['body']);
$ps = $dom->getElementsByTagName('p');
$xpath = new DOMXPath($dom);
foreach($ps as $p)
{
    if ($p->parentNode->getAttribute( "id" ) == 'quick_preview') {
        $desc_element = $dom->createElement('description');
        $desc_element->appendChild($p);
        $divs = $xpath->query('//div[@id="quick_preview"]');
        foreach($divs as $div){
            $div->appendChild($desc_element);
        }
    }
}
echo $dom->saveHTML();
...