Как вернуть внешний 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>
Есть идеи как этого добиться?
3 ответа
Начиная с PHP 5.3.6 вы можете передать узел saveHtml
например,
$domDocument->saveHtml($nodeToGetTheOuterHtmlFrom);
Предыдущие версии PHP не реализовывали такую возможность. Вы должны использовать saveXml()
, но это создаст XML-совместимую разметку. В случае <a>
элемент, это не должно быть проблемой, хотя.
Смотрите http://blog.gordon-oheim.biz/2011-03-17-The-DOM-Goodie-in-PHP-5.3.6/
Вы можете найти пару предложений в заметках пользователей раздела 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;
}
?>
Лучшее возможное решение - определить вашу собственную функцию, которая будет возвращать вам externalhtml:
function outerHTML($e) {
$doc = new DOMDocument();
$doc->appendChild($doc->importNode($e, true));
return $doc->saveHTML();
}
чем вы можете использовать в своем коде
echo outerHTML($link);
Переименуйте файл с href в links.html или links.html, чтобы сказать google.com/fly.html, в котором есть flv, или измените flv на wmv и т. Д., Если вы хотите href, если есть другие href, он также подберет их
<?php
$contents = file_get_contents("links.html");
$domdoc = new DOMDocument();
$domdoc->preservewhitespaces=“false”;
$domdoc->loadHTML($contents);
$xpath = new DOMXpath($domdoc);
$query = '//@href';
$nodeList = $xpath->query($query);
foreach ($nodeList as $node){
if(strpos($node->nodeValue, ".flv")){
$linksList = $node->nodeValue;
$htmlAnchor = new DOMElement("a", $linksList);
$htmlURL = new DOMAttr("href", $linksList);
$domdoc->appendChild($htmlAnchor);
$htmlAnchor->appendChild($htmlURL);
$domdoc->saveHTML();
echo ("<a href='". $node->nodeValue. "'>". $node->nodeValue. "</a><br />");
}
}
echo("done");
?>