Not mentioned in the documentation is the fact that using DOMDocument::saveHTMLFile() will automatically overwrite the contents if an existing file is used - with no notice, warning or error thrown.
Make sure you check the filename before using this function so that you don't accidentally overwrite important files.
Example:
<?php
$file = fopen('test.html', 'w');
fwrite($file, 'this is some text');
fclose($file);
$doc = new DOMDocument();
$doc->formatOutput = true;
$doc->loadHTML('<html><head><title>Test</title></head><body></body></html>');
$doc->saveHTMLFile('test.html');
// test.html
/*
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test</title>
</head>
<body></body>
</html>
*/
?>
If you're dynamically generating a series of pages using DOMDocument objects, make sure you are also dynamically generating the file or directory names using something that can't easily be confused for an existing file/folder, or check if the desired path already exists before saving so that you don't accidentally delete previous files.
DOMDocument::saveHTMLFile
(PHP 5)
DOMDocument::saveHTMLFile — Sauvegarde un document interne dans un fichier en utilisant un formatage HTML
Description
int DOMDocument::saveHTMLFile
( string
$filename
)Crée un document HTML depuis une représentation DOM. Cette fonction est habituellement appelée après la construction d'un tout nouveau document DOM, comme dans l'exemple ci-dessous.
Liste de paramètres
-
filename -
Le chemin où l'on doit sauvegarder le document HTML.
Valeurs de retour
Retourne le nombre d'octets écrit ou FALSE si une erreur survient.
Exemples
Exemple #1 Sauvegarde d'un arbre HTML dans un fichier
<?php
$doc = new DOMDocument('1.0');
// nous voulons un joli affichage
$doc->formatOutput = true;
$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('Ceci est le titre');
$text = $title->appendChild($text);
echo 'Écrit : ' . $doc->saveHTMLFile("/tmp/test.html") . ' bytes'; // Écrit : 129 bytes
?>
Voir aussi
- DOMDocument::saveHTML() - Sauvegarde le document interne dans une chaîne en utilisant un formatage HTML
- DOMDocument::loadHTML() - Charge du code HTML à partir d'une chaîne de caractères
- DOMDocument::loadHTMLFile() - Charge du HTML à partir d'un fichier
naebeth at hotmail dot NOSPAM dot com ¶
7 months ago
deep42thouSPAMght42 at y_a_h_o_o dot com ¶
2 years ago
I foolishly assumed that this function was equivalent to
<?php
file_put_contents($filename, $document->saveHTML());
?>
but there are differences in the generated HTML:
<?php
$doc = new DOMDocument();
$doc->loadHTML(
'<html><head><title>Test</title></head><body></body></html>'
);
$doc->encoding = 'iso-8859-1';
echo $doc->saveHTML();
#<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
#<html>
#<head><title>Test</title></head>
#<body></body>
#</html>
$doc->saveHTMLFile('output.html');
#<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
#<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Test</title></head><body></body></html>
?>
Note that saveHTMLFile() adds a UTF-8 meta tag despite the ISO-8859-1 document encoding.
