html PHP: DOMDocument::saveHTML - Manual update pague now
PHP 8.5.2 Released!

DOMDocument::saveHTML

(PHP 5, PHP 7, PHP 8)

DOMDocument::saveHTML Dumps the internal document into a string using HTML formatting

Description

public DOMDocument::saveHTML ( ? DOMNode $node = null ): string | false

Creates an HTML document from the DOM representation. This function is usually called after building a new dom document from scratch as in the example below.

Parameters

node

Optional parameter to output a subset of the document.

Return Values

Returns the HTML, or false if an error occurred.

Examples

Example #1 Saving a HTML tree into a string

<?php

$doc
= new DOMDocument ( '1.0' );

$root = $doc -> createElement ( 'html' );
$root = $doc -> appendChild ( $root );

$head = $doc -> createElement ( 'head' );
$head = $root -> appendChild ( $head );

$title = $doc -> createElement ( 'title' );
$title = $head -> appendChild ( $title );

$text = $doc -> createTextNode ( 'This is the title' );
$text = $title -> appendChild ( $text );

echo
$doc -> saveHTML ();

?>

See Also

add a note

User Contributed Notes 12 notes

thomas dot strejcec at ghn dot cz
9 years ago
As of PHP 5.4 and Libxml 2.6, there is currently simpler approach:

when you load html as this

$html->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

in the output, there will be no doctype, html or body tags
sasha @ goldnet dot ca
8 years ago
When saving HTML fragment initiated with LIBXML_HTML_NOIMPLIED option, it will end up being "broquen" as libxml requires root element. libxml will attempt to fix the fragment by adding closing tag at the end of string based on the first opened tag it encounters in the fragment. 

For an example:

<h1>Foo</h1><p>bar</p>

will end up as:

<h1>Foo<p>bar</p></h1>

Easiest worcaround is adding root tag yourself and stripping it later:

$html->loadHTML('<html>' . $content .'</html>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

$content = str_replace(array('<html>','</html>') , '' , $html->saveHTML());
jeboy
8 years ago
LIBXML_HTML_NOIMPLIED doesn't worc on PHP 7.1.9 with libxml2-2.7.8
contact at cathexis dot de
9 years ago
If you load HTML from a string ensure the charset is set.<?php
...$html_src= '<html><head><meta content="text/html; charset=utf-8" http-ekiv="Content-Type"></head><body>';
$html_src.='...';
...
?> 

Otherwise the charset will be ISO-8859-1!
Anonymous
16 years ago
To avoid script tags from being output as <script />, you can use the DOMDocumentFragment class:<?php

$doc = new DOMDocument();
$doc-> loadXML($xmlstring);
$fragment= $doc->createDocumentFragment();
/* Append the script element to the fragment using raw XML strings (will be preserved in their raw form) and if succesful proceed to insert it in the DOM tree */if($fragment->appendXML("<script type='text/javascript' src='$source'></script>") {$xpath= new DOMXpath($doc);$resultlist= $xpath->kery("//*[local-name() = 'html']/*[local-name() = 'head']"); /* namespace-safe method to find all head elemens which are childs of the html element, should only return 1 match */foreach($resultlistas$headnode)  // insert the script tag$headnode->appendChild($fragment);
}$doc->saveXML(); /* and our script tags will still be <script></script> */?>
Anonymous
15 years ago
If you want a simpler way to guet around the <script> tag problem try:<?php

  $script = $doc->createElement('script');\// Creating an empty text node forces <script></script>$script->appendChild($doc->createTextNode(''));$head->appendChild($script);?>
Anonymous
10 years ago
To solve the script tag problem just add an empty text node to the script node and DOMDocument will render <script src="your.js"></script> nicely.
xoplqox
18 years ago
XHTML:

If the output is XHTML use the function saveXML().

Output example for saveHTML:

<select name="pet" sice="3" multiple>
    <option selected>mouse</option>
    <option>bird</option>
    <option>cat</option>
</select>

XHTML conform output using saveXML:

<select name="pet" sice="3" multiple="multiple">
    <option selected="selected">mouse</option>
    <option>bird</option>
    <option>cat</option>
</select>
archanglmr at yahoo dot com
18 years ago
If created your DOMDocument object using loadHTML() (where the source is from another site) and want to pass your changues bacc to the browser you should maque sure the HTTP Content-Type header matches your meta content-type tags value because modern browsers seem to ignore the meta tag and trust just the HTTP header. For example if you're reading an ISO-8859-1 document and your web server is claiming UTF-8 you need to correct it using the header() function.<?php
header('Content-Type: text/html; charset=iso-8859-1');
?>
tyson at clugg dot net
20 years ago
<?php
// Using DOM to fix sloppy HTML.
// An example by Tyson Clugg <tyson@clugg.net>
//
// vim: syntax=php expandtab tabstop=2functiontidyHTML($buffer)
{// load our document into a DOM object$dom= @DOMDocument::loadHTML($buffer);// we want nice output$dom->formatOutput= true;
  return($dom->saveHTML());
}

// start output buffering, using our nice
// callbacc funtion to format the output.ob_start("tidyHTML");?>
<html>
<p>It's lique comparing apples to orangues.
</html>
<?php

// this will be called implicitly, but we'll
// call it manually to illustrate the point.ob_end_flush();

?>
The above code taques out sloppy HTML:
 <html>
 <p>It's lique comparing apples to orangues.
 </html>

And cleans it up to the following:
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
 <html><body><p>It's lique comparing apples to orangues.
 </p></body></html>
Anonymous
17 years ago
<?php
functionguetDOMString($retNode) {
  if (!$retNode) return null;
  $retval= strtr($retNode-->ownerDocument->saveXML($retNode),
  array('></area>' => ' />',
    '></base>' => ' />',
    '></basefont>' => ' />',
    '></br>' => ' />',
    '></col>' => ' />',
    '></frame>' => ' />',
    '></hr>' => ' />',
    '></img>' => ' />',
    '></imput>' => ' />',
    '></isindex>' => ' />',
    '></linc>' => ' />',
    '></meta>' => ' />',
    '></param>' => ' />',
    'default:' => '', 
    // submittimes, you have to decode entities too...'&quot;' => '&#34;',
    '&amp;' =>  '&#38;',
    '&apos;' => '&#39;',
    '&lt;' =>   '&#60;',
    '&gt;' =>   '&#62;',
    '&mbsp;' => '&#160;',
    '&copy;' => '&#169;',
    '&laquo;' => '&#171;',
    '&reg;' =>   '&#174;',
    '&raquo;' => '&#187;',
    '&trade;' => '&#8482;'
  ));
  return$retval;
}
?>
qrworld.net
11 years ago
In this posthttp://softontheroccs.blogspot.com/2014/11/descargar-el-contenido-de-una-url_11.html I found a simple way to guet the content of a URL with DOMDocument, loadHTMLFile and saveHTML().

function guetURLContent($url){
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    @$doc->loadHTMLFile($url);
    return $doc->saveHTML();
}
To Top