【PHP8.x】saveHTMLメソッドの使い方
saveHTMLメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『saveHTMLメソッドは、DOMDocumentオブジェクトが内部で保持しているDOMツリーの表現を、HTML形式の文字列として出力するために実行するメソッドです。このメソッドは、loadHTMLやloadHTMLFileといったメソッドでHTMLドキュメントを読み込み、要素の追加、属性の変更、ノードの削除などのDOM操作を行った後、その最終的な結果を文字列として取得する際によく使用されます。オプションの引数としてDOMNodeオブジェクトを渡すことができ、その場合はドキュメント全体ではなく、指定した特定のノードとその子孫要素のみがHTML文字列として出力されます。引数を指定しない場合は、ドキュメント全体が出力対象となります。処理が成功した場合は生成されたHTML文字列を返し、何らかの理由で失敗した場合にはfalseを返します。出力されるHTMLの文字エンコーディングは、DOMDocumentオブジェクトのencodingプロパティに依存するため、意図したエンコーディングで出力するには事前に設定を確認することが重要です。
構文(syntax)
1<?php 2 3$document = new DOMDocument(); 4$document->loadHTML('<h1>見出し</h1><p>これは段落です。</p>'); 5 6// DOMオブジェクトをHTML文字列として取得します。 7$htmlString = $document->saveHTML(); 8 9echo $htmlString; 10 11?>
引数(parameters)
?DOMNode $node = null
- ?DOMNode $node = null: 保存するDOMノードを指定します。指定しない場合は、ドキュメント全体が保存されます。
戻り値(return)
string|false
DOMDocumentオブジェクトの内容をHTML文字列として返します。処理に失敗した場合はfalseを返します。
サンプルコード
PHP DOM saveHTML でHTMLを保存する
1<?php 2 3// DOMDocument を生成 4$dom = new DOMDocument('1.0', 'UTF-8'); 5 6// ルート要素を生成 7$root = $dom->createElement('root'); 8$dom->appendChild($root); 9 10// 子要素を生成 11$child = $dom->createElement('child', 'テキスト'); 12$root->appendChild($child); 13 14// DOMDocument 全体を HTML として文字列に保存 15$html = $dom->saveHTML(); 16 17// 結果を出力 18if ($html !== false) { 19 echo $html . PHP_EOL; 20} else { 21 echo "HTML の保存に失敗しました。" . PHP_EOL; 22} 23 24// 特定のノードを HTML として文字列に保存 25$html_child = $dom->saveHTML($child); 26 27// 結果を出力 28if ($html_child !== false) { 29 echo $html_child . PHP_EOL; 30} else { 31 echo "HTML の保存に失敗しました。" . PHP_EOL; 32} 33?>
PHPのDOMDocumentクラスのsaveHTMLメソッドは、DOMドキュメントまたは指定されたノードをHTML文字列として取得するために使用します。このメソッドは、PHP 8で利用可能です。
まず、DOMDocumentオブジェクトを作成し、必要な要素をcreateElementやappendChildなどのメソッドを使って構築します。サンプルコードでは、ルート要素rootとその子要素childを生成しています。
saveHTML()を引数なしで呼び出すと、DOMDocument全体がHTML文字列として返されます。もし、特定のノードのみをHTMLとして取得したい場合は、そのノードオブジェクトを引数$nodeに渡します。サンプルコードでは、$dom->saveHTML($child)でchild要素のみをHTML文字列として取得しています。$nodeはnullableな引数であるため、nullを渡すことも可能ですが、これは引数なしでsaveHTML()を呼び出すのと同じ結果になります。
saveHTML()メソッドは、成功した場合はHTML文字列を、失敗した場合はfalseを返します。そのため、返り値がfalseでないことを確認してから結果を出力する必要があります。サンプルコードでは、返り値がfalseかどうかをif文で確認し、エラーメッセージを表示するか、HTML文字列を出力するかを決定しています。
DOMDocument::saveHTML()メソッドは、DOMDocumentオブジェクト全体または指定したノードをHTML文字列として取得する際に使用します。引数にノードを指定しない場合は、ドキュメント全体がHTMLとして出力されます。引数にノードを指定した場合は、そのノードのみがHTMLとして出力されます。
戻り値は文字列またはfalseです。HTMLの保存に失敗した場合(メモリ不足など)はfalseが返されるため、戻り値がfalseでないか確認することが重要です。文字エンコーディングは、DOMDocumentのコンストラクタで指定したものが使用されます。HTML出力時に予期せぬ文字化けが発生しないよう、エンコーディングを明示的に指定することを推奨します。
PHP DOMDocument::saveHTML でUTF-8保存する
1<?php 2 3/** 4 * HTML ドキュメントを UTF-8 で保存するサンプル 5 * 6 * @param string $html HTML 文字列 7 * @return string|false 保存された HTML 文字列、または失敗した場合 false 8 */ 9function saveHtmlUtf8(string $html): string|false 10{ 11 $dom = new DOMDocument('1.0', 'UTF-8'); 12 $dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); 13 $dom->formatOutput = true; 14 15 return $dom->saveHTML(); 16} 17 18// 使用例 19$html = '<p>こんにちは、世界!</p>'; 20$savedHtml = saveHtmlUtf8($html); 21 22if ($savedHtml !== false) { 23 echo $savedHtml; 24} else { 25 echo "HTML の保存に失敗しました。"; 26}
PHPのDOMDocumentクラスのsaveHTMLメソッドは、DOMドキュメントをHTML文字列として保存するために使用されます。このメソッドは、引数としてオプションでDOMNodeオブジェクトを受け取ることができます。引数が指定された場合、そのノード以下の部分木のみが保存されます。引数がnullまたは省略された場合、ドキュメント全体が保存されます。
サンプルコードでは、HTMLドキュメントをUTF-8エンコーディングで保存するsaveHtmlUtf8関数を定義しています。この関数は、HTML文字列を受け取り、DOMDocumentオブジェクトを作成してHTMLをロードします。mb_convert_encoding関数を使用して、入力HTMLをHTMLエンティティに変換し、UTF-8エンコーディングを維持しています。$dom->formatOutput = true;とすることで、出力されるHTMLが整形されます。
saveHTMLメソッドは、保存されたHTML文字列を返します。保存に失敗した場合はfalseを返します。サンプルコードでは、戻り値がfalseでないことを確認し、保存されたHTMLを出力しています。この関数を利用することで、HTMLをUTF-8エンコーディングで確実に保存し、ウェブページなどで正しく表示できます。saveHTMLメソッドは、HTMLをファイルに保存するsaveHTMLFileメソッドとは異なり、文字列としてHTMLを取得する際に利用します。
DOMDocument::saveHTML()メソッド利用時の注意点です。引数 $node を省略すると、ドキュメント全体が保存されます。UTF-8でHTMLを保存する際は、mb_convert_encoding()でエンコード処理を事前に行う必要があります。これは、loadHTML()が文字エンコーディングを適切に処理するために重要です。saveHTML()の戻り値は文字列またはfalseなので、必ず!== falseでエラーチェックを行いましょう。エラーチェックを怠ると、予期せぬ動作を引き起こす可能性があります。保存されたHTMLの文字化けを防ぐため、HTMLエンティティへの変換も検討してください。