Как вернуть внешний html DOMDocument?

Я пытаюсь заменить видео-ссылки внутри строки - здесь мой код:

$doc = new DOMDocument();
$doc->loadHTML($content);
foreach ($doc->getElementsByTagName("a") as $link) 
{
    $url = $link->getAttribute("href");
    if(strpos($url, ".flv"))
    {
        echo $link->outerHTML();
    }
}

К сожалению, outerHTML не работает, когда я пытаюсь получить html-код для полной гиперссылки, например <a href='http://www.myurl.com/video.flv'></a>

Любые идеи, как достичь этого?

Ответы

Ответ 1

Начиная с PHP 5.3.6 вы можете передать node в saveHtml, например.

$domDocument->saveHtml($nodeToGetTheOuterHtmlFrom);

Предыдущие версии PHP не реализовали эту возможность. Вы должны использовать saveXml(), но это создало бы разметку, совместимую с XML. В случае элемента <a> это не должно быть проблемой.

См. http://blog.gordon-oheim.biz/2011-03-17-The-DOM-Goodie-in-PHP-5.3.6/

Ответ 2

Вы можете найти пару предложений в примечаниях пользователей раздел DOM Руководства по PHP.

Например, здесь вы отправили xwisdom:

<?php
// code taken from the Raxan PDI framework
// returns the html content of an element
protected function nodeContent($n, $outer=false) {
    $d = new DOMDocument('1.0');
    $b = $d->importNode($n->cloneNode(true),true);
    $d->appendChild($b); $h = $d->saveHTML();
    // remove outter tags
    if (!$outer) $h = substr($h,strpos($h,'>')+1,-(strlen($n->nodeName)+4));
    return $h;
}
?> 

Ответ 3

Лучшим решением является определение вашей собственной функции, которая вернет вас outerhtml:

function outerHTML($e) {
     $doc = new DOMDocument();
     $doc->appendChild($doc->importNode($e, true));
     return $doc->saveHTML();
}

чем вы можете использовать в своем коде

echo outerHTML($link);