【PHP8.x】saveHTMLメソッドの使い方

saveHTMLメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

『saveHTMLメソッドは、DOMDocumentオブジェクトが内部で保持しているDOMツリーの表現を、HTML形式の文字列として出力するために実行するメソッドです。このメソッドは、loadHTMLloadHTMLFileといったメソッドで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エンティティへの変換も検討してください。

関連コンテンツ

関連プログラミング言語