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

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

作成日: 更新日:

基本的な使い方

saveHtmlメソッドは、DOMドキュメント全体をHTMLとして文字列で返すメソッドです。Dom\HTMLDocumentクラスに属し、PHPのDOM拡張モジュールで使用されます。このメソッドは引数を取らず、ドキュメント全体をHTML形式の文字列として返します。

具体的には、Dom\HTMLDocumentオブジェクトが表すHTMLドキュメントを、シリアライズ(文字列化)して返します。この際、ドキュメント内のすべての要素、属性、テキストノードなどがHTMLとして表現されます。

saveHTMLメソッドは、特にHTMLドキュメントの構造をプログラムで操作した後、その結果をHTMLファイルとして保存したり、ウェブブラウザに表示したりする際に有用です。例えば、既存のHTMLファイルを読み込み、特定の要素を追加、変更、削除した後、変更後のHTMLをファイルに書き出すといった処理に使えます。

なお、このメソッドは、内部的にlibxml2ライブラリを利用しており、そのライブラリの設定やエンコーディングに影響を受けることがあります。例えば、HTMLのエンコーディングが正しく設定されていない場合、文字化けが発生する可能性があります。そのため、Dom\HTMLDocumentオブジェクトを作成する際や、ドキュメントの内容を操作する際には、適切なエンコーディングを指定することが重要です。

また、saveHTMLメソッドは、ドキュメント全体を文字列として返すため、大きなドキュメントの場合、メモリを大量に消費する可能性があります。そのため、大規模なHTMLドキュメントを扱う場合は、必要に応じて、ドキュメントの一部のみを処理するなどの工夫が必要です。

構文(syntax)

1Dom\HTMLDocument::saveHtml(): string|false

引数(parameters)

?Dom\Node $node = null

  • ?Dom\Node $node = null: HTMLドキュメント全体、または指定したDOMノードからHTML文字列を生成します。省略時はドキュメント全体が対象となります。

戻り値(return)

string

DOMDocumentオブジェクトのHTML表現を文字列として返します。

サンプルコード

PHP DOM saveHTMLでHTMLを保存する

1<?php
2
3// HTMLドキュメントを生成し、一部または全部をHTML文字列として保存する例
4$dom = new DomDocument();
5$dom->loadHTML('<!DOCTYPE html><html><body><h1>Hello, World!</h1><p id="myParagraph">This is a paragraph.</p></body></html>');
6
7// ドキュメント全体を保存
8$html = $dom->saveHTML();
9echo "ドキュメント全体:\n";
10echo $html . "\n\n";
11
12// 特定のノード (例えば、id="myParagraph" の段落) を保存
13$paragraph = $dom->getElementById('myParagraph');
14
15if ($paragraph) {
16    $paragraphHtml = $dom->saveHTML($paragraph);
17    echo "特定のノード (id='myParagraph'):\n";
18    echo $paragraphHtml . "\n";
19} else {
20    echo "指定されたIDのノードが見つかりませんでした。\n";
21}
22
23// 新しいノードを作成してドキュメントに追加し、保存する例
24$newNode = $dom->createElement('div');
25$newNode->textContent = '追加された新しい要素';
26$dom->documentElement->appendChild($newNode); // body要素など、適切な場所にappendChildする
27
28$newHtml = $dom->saveHTML($newNode);
29echo "新しく追加されたノード:\n";
30echo $newHtml . "\n";

PHPのDom\HTMLDocumentクラスのsaveHTMLメソッドは、DOMドキュメントまたは指定されたノードのHTMLを文字列として取得するために使用します。このメソッドは、引数にDom\Nodeオブジェクトを受け取ります。引数が省略された場合(nullが渡された場合)、ドキュメント全体がHTML文字列として返されます。引数にノードが指定された場合、そのノードとそのすべての子ノードを含むHTMLが返されます。

サンプルコードでは、まずDomDocumentオブジェクトを作成し、HTML文字列をロードしています。そして、saveHTML()を引数なしで呼び出すことで、ドキュメント全体のHTMLを取得し、出力しています。

次に、getElementById()メソッドを使って、id属性が"myParagraph"である要素を取得し、そのノードを引数としてsaveHTML()を呼び出すことで、特定のノードのHTMLを取得し、出力しています。要素が見つからない場合は、エラーメッセージを表示します。

最後に、新しいdiv要素を作成し、テキストコンテンツを設定した後、ドキュメントに追加しています。そして、作成した新しいノードを引数としてsaveHTML()を呼び出し、そのノードのHTMLを取得して出力しています。

このsaveHTMLメソッドは、DOMツリーの一部または全部をHTML文字列として出力する必要がある場合に非常に便利です。たとえば、HTMLエディタでコンテンツを保存したり、Webページの一部を動的に生成したりする際に利用できます。戻り値は常に文字列であるため、文字列操作やデータベースへの保存なども容易に行えます。

DomDocument::saveHTML()メソッドは、指定されたノード、またはドキュメント全体をHTML文字列として返します。引数 $nodenull を渡すとドキュメント全体が保存されます。特定のノードを保存したい場合は、getElementById()などでノードを取得し、引数として渡します。appendChild()でノードを追加する際は、追加先をdocumentElementプロパティなどを使って適切に指定する必要があります。保存されたHTMLは文字列として返されるため、echoなどで出力する必要があります。HTMLの構造が正しくないと、意図しない結果になる可能性があるため、事前にloadHTML()で読み込むHTMLが正しいことを確認すると良いでしょう。

PHP saveHTMLでHTMLをUTF-8で保存する

1<?php
2
3/**
4 * Dom\HTMLDocument を使用して日本語を含むHTMLを安全に操作し、
5 * UTF-8エンコーディングで文字列として出力するサンプル関数です。
6 */
7function manipulateHtmlWithUtf8(): void
8{
9    // 操作対象のHTML文字列を定義します。
10    // 日本語のようなマルチバイト文字を正しく扱うためには、
11    // HTML内に <meta charset="UTF-8"> を指定することが非常に重要です。
12    $htmlString = <<<HTML
13    <!DOCTYPE html>
14    <html lang="ja">
15    <head>
16        <meta charset="UTF-8">
17        <title>DOMDocument UTF-8 テスト</title>
18    </head>
19    <body>
20        <h1>こんにちは、世界!</h1>
21    </body>
22    </html>
23    HTML;
24
25    // Dom\HTMLDocument のインスタンスを作成します。
26    // PHP 8から、DOM拡張機能は `Dom` 名前空間に属します。
27    $doc = new Dom\HTMLDocument();
28
29    // HTML文字列をドキュメントに読み込みます。
30    // HTML5の要素で発生しうる警告を抑制するために @ を付けています。
31    @$doc->loadHTML($htmlString);
32
33    // body要素を取得します。
34    $body = $doc->getElementsByTagName('body')->item(0);
35
36    // 新しい p 要素を作成し、テキストノードを追加します。
37    $p = $doc->createElement('p', 'この段落はPHPスクリプトによって動的に追加されました。');
38
39    // body要素の末尾に新しいp要素を追加します。
40    if ($body instanceof Dom\Node) {
41        $body->appendChild($p);
42    }
43
44    // saveHTML()メソッドで、ドキュメント全体をHTML文字列として取得します。
45    // loadHTML()でUTF-8が正しく認識されていれば、出力もUTF-8になります。
46    $outputHtml = $doc->saveHTML();
47
48    // ブラウザが正しくUTF-8として解釈できるよう、Content-Typeヘッダーを設定します。
49    header('Content-Type: text/html; charset=utf-8');
50
51    // 変更後のHTML文字列を出力します。
52    echo $outputHtml;
53}
54
55// 関数を実行します。
56manipulateHtmlWithUtf8();

Dom\HTMLDocumentクラスのsaveHTMLメソッドは、DOMドキュメントをHTML文字列として取得するために使用します。PHP 8以降では、DOM拡張機能はDom名前空間に属します。このメソッドを使用する際は、HTMLドキュメントの文字エンコーディングがUTF-8であることを確認してください。特に日本語のようなマルチバイト文字を扱う場合、HTML内に<meta charset="UTF-8">を記述することが重要です。

引数$nodeは省略可能で、特定のノードを指定すると、そのノード以下のみがHTML文字列として返されます。省略した場合、ドキュメント全体がHTML文字列として出力されます。戻り値は、HTML文字列です。

サンプルコードでは、まずHTML文字列をDom\HTMLDocumentオブジェクトに読み込み、body要素を取得して、新しい段落(p要素)を動的に追加しています。その後、saveHTML()メソッドを使用して、変更後のHTMLドキュメント全体をUTF-8エンコーディングの文字列として取得し、ブラウザに表示しています。header('Content-Type: text/html; charset=utf-8')を設定することで、ブラウザが正しくUTF-8として解釈できるようにしています。loadHTML()でUTF-8が正しく認識されていれば、出力もUTF-8になります。

Dom\HTMLDocument::saveHTML()メソッド利用時の注意点です。まず、HTML内に<meta charset="UTF-8">を記述し、UTF-8エンコーディングを明示することが重要です。loadHTML()関数を使用する際、HTML5要素に関する警告が表示されることがあるため、@演算子で抑制しています。saveHTML()でUTF-8が正しく認識されるためには、loadHTML()での読み込みが重要になります。また、出力前にheader('Content-Type: text/html; charset=utf-8');を設定し、ブラウザにUTF-8として解釈させる必要があります。これらの点に注意することで、日本語を含むHTMLを安全かつ正しく操作し、UTF-8で出力できます。