2011-03-23 15 views
15

que estoy tratando de reemplazar enlaces de vídeo dentro de una cadena - Aquí está mi código:Cómo devolver el html externo de DOMDocument?

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

Desafortunadamente, outerHTML no funciona cuando estoy tratando de conseguir el código html para el hipervínculo completa como <a href='http://www.myurl.com/video.flv'></a>

¿Alguna idea de cómo lograr esto?

Respuesta

18

A partir de PHP 5.3.6 puede pasar un nodo a saveHtml, p. Ej.

$domDocument->saveHtml($nodeToGetTheOuterHtmlFrom); 

Las versiones anteriores de PHP no implementaron esa posibilidad. Tendría que usar saveXml(), pero eso crearía un marcado compatible con XML. En el caso de un elemento <a>, eso no debería ser un problema.

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

+0

El DOMNode también contiene el DOMDocument que lo contiene, por lo que puede hacerlo si Solo tiene el nodo del que desea obtener el código HTML de: $ domNode-> ownerDocument-> saveHTML ($ domNode); – rooby

6

se puede encontrar un par de proposiciones en los usuarios de Notes del DOM section del Manual de PHP.

Por ejemplo, aquí está uno publicado por 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

gracias por eso, pero en realidad estoy buscando el html EXTERIOR completo - el código completo que incluye :/ – Fuxi

+0

@Fuxi a juzgar por el código, diría que tiene que establecer $ outer a TRUE. Pero realmente no hay ninguna razón para usar esa función, porque puedes usar 'saveXml' y' saveHTML' para obtener el externalHTML como se explicó en mi respuesta. – Gordon

+0

@Gordon gracias por su comentario :-) * (Y estoy de acuerdo con la idea de "use saveHTML" - si usa PHP> = 5.3.6) * –

3

La mejor solución posible es definir su propia función que devolverá que outerHTML:

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

que se puede utilizar en su código

echo outerHTML($link); 
+0

¡La mejor solución, la más corta y funciona bien! – Pepijn

+0

Solo para PHP <5.3.6, después de eso simplemente proporcione el nodo como argumento para saveHTML(), como escribió Gordon. No es necesario crear un documento completo, solo para guardar un solo nodo. – ThW

Cuestiones relacionadas