2011-03-23 38 views
15

我試圖替換字符串中的視頻鏈接 - 這裏是我的代碼:如何返回DOMDocument的外部html?

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

工作

任何想法如何實現這一目標?

回答

18

從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/

+0

DOMNode還包含包含DOMDocument,所以你可以這樣做,如果y ou只有你想得到HTML的節點: $ domNode-> ownerDocument-> saveHTML($ domNode); – rooby 2014-07-16 06:43:39

6

你可以找到幾個命題在PHP手冊的DOM section的用戶注意事項。

例如,這裏有一個發表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; 
} 
?> 
+0

謝謝你,但我實際上是在尋找完整的外部html - 完整的代碼,包括:/ – Fuxi 2011-03-23 12:27:26

+0

@Fuxi通過代碼判斷我會說你必須將$ outer設置爲TRUE。但是真的沒有理由使用該函數,因爲您可以使用'saveXml'和'saveHTML'來獲得外部HTML,就像我在答案中所解釋的那樣。 – Gordon 2011-03-23 12:31:09

+0

@戈登感謝您的評論:-) *(我同意「使用saveHTML」的想法 - 如果使用PHP> = 5.3.6)* – 2011-03-23 12:32:10

3

最佳的解決方案是定義自己的函數將返回outerhtml:

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

比你可以在你的代碼中使用

echo outerHTML($link); 
+0

最好的解決方案,最短的和運作良好! – Pepijn 2014-11-05 12:57:43

+0

僅適用於PHP <5.3.6,之後只需提供節點作爲saveHTML()的參數,就像Gordon寫的那樣。無需創建完整文檔,只需保存單個節點即可。 – ThW 2015-02-22 15:58:41