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

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

作成日: 更新日:

基本的な使い方

『loadHTMLメソッドは、引数で指定されたHTML文字列を解析し、DOMDocumentオブジェクトの内部にDOMツリーとして構築する処理を実行するメソッドです。このメソッドの大きな特徴は、XMLのように厳密な文法を要求せず、閉じタグが不足しているなど、完全ではないHTMLもある程度自動的に補完しながら解釈を試みる点です。そのため、Webページから取得したHTMLデータの解析など、必ずしも整形式でない文書を扱う場面で特に有効です。第一引数に解析対象のHTML文字列を渡し、オプションの第二引数には、解析の挙動を制御するための定数を指定できます。例えば、LIBXML_HTML_NOIMPLIEDフラグを使用すると、<html><body>タグが自動的に追加されるのを防ぐことができます。注意点として、このメソッドはデフォルトでISO-8859-1エンコーディングとしてデータを解釈するため、UTF-8などのマルチバイト文字を含むHTMLを扱う際は、HTMLソース内に<meta charset="UTF-8">のような指定が必要です。メソッドは成功時にtrueを返しますが、解析エラーが発生した場合は警告を発生させることが多いため、エラーを詳細に管理したい場合はlibxml_use_internal_errors関数と組み合わせて使用することが推奨されます。

構文(syntax)

1$document = new DOMDocument();
2
3$html_string = '<!DOCTYPE html><html><body><h1>Page Title</h1><p>This is a paragraph.</p></body></html>';
4
5$document->loadHTML($html_string);

引数(parameters)

string $source, int $options = 0

  • string $source: ロードするHTMLソースを指定する文字列
  • int $options = 0: DOMDocumentの動作を制御するオプションを指定する整数

戻り値(return)

bool

HTML文字列をDOMDocumentオブジェクトにロードする処理の成功または失敗を示します。成功した場合はtrueを、失敗した場合はfalseを返します。

サンプルコード

PHP DOMDocument loadHTMLでHTML文字列を読み込む

1<?php
2
3// HTML文字列をDOMDocumentオブジェクトに読み込むサンプル
4$htmlString = <<<HTML
5<!DOCTYPE html>
6<html>
7<head>
8    <title>サンプルページ</title>
9</head>
10<body>
11    <h1>こんにちは、世界!</h1>
12    <p>これはサンプルテキストです。</p>
13</body>
14</html>
15HTML;
16
17$dom = new DOMDocument();
18
19// HTML文字列を読み込む
20$loadSuccess = $dom->loadHTML($htmlString);
21
22if ($loadSuccess) {
23    // 読み込みに成功した場合、ルート要素を出力
24    echo $dom->documentElement->tagName . PHP_EOL; // html
25    
26    // 必要に応じてDOMを操作する
27    $h1Elements = $dom->getElementsByTagName('h1');
28    if ($h1Elements->length > 0) {
29        echo $h1Elements->item(0)->textContent . PHP_EOL; // こんにちは、世界!
30    }
31
32} else {
33    echo "HTMLの読み込みに失敗しました。";
34}
35

PHPのDOMDocumentクラスのloadHTMLメソッドは、HTML文字列を解析してDOMDocumentオブジェクトに読み込むために使用します。引数 $source には、読み込むHTML文字列を指定します。オプションの引数 $options は、読み込み処理の挙動を制御するためのフラグを指定できますが、省略した場合はデフォルト値の 0 が使用されます。

このサンプルコードでは、まずDOMDocumentオブジェクトを生成しています。次に、loadHTMLメソッドを使って、 $htmlString に格納されたHTML文字列をDOMDocumentオブジェクトに読み込んでいます。loadHTMLメソッドは、読み込みが成功した場合はtrue、失敗した場合はfalseを返します。

サンプルコードでは、loadSuccess変数で読み込みの成否を確認しています。成功した場合、$dom->documentElement->tagNameでルート要素のタグ名(この場合は"html")を出力しています。また、getElementsByTagNameメソッドを使用して、h1要素を取得し、その内容(textContent)を出力しています。このように、読み込んだDOMDocumentオブジェクトに対して、様々な操作を行うことができます。

もしHTMLの読み込みに失敗した場合(loadSuccessfalseの場合)は、「HTMLの読み込みに失敗しました。」というエラーメッセージが表示されます。loadHTMLメソッドは、HTMLドキュメントを解析し、DOMツリーを構築する上で非常に便利なメソッドです。

DOMDocument::loadHTMLメソッドは、HTML文字列をDOMDocumentオブジェクトに読み込む関数です。引数 $source には読み込むHTML文字列を指定します。$options はエンコーディング関連のオプションですが、通常はデフォルト値の0で問題ありません。

このメソッドを利用する際の注意点として、HTML文字列のエンコーディングが適切であるかを確認してください。文字化けが発生する場合は、mb_convert_encodingなどでエンコーディングを変換してからloadHTMLに渡すと改善する場合があります。また、HTMLの構造が正しくない場合、読み込みに失敗することがあります。libxml_use_internal_errors(true) を使用すると、エラーメッセージを捕捉できます。読み込みの成否は戻り値で確認し、エラー処理を適切に行うようにしましょう。

PHP DOMDocument loadHTMLでUTF-8を読み込む

1<?php
2
3// HTML文字列をUTF-8でDOMDocumentに読み込むサンプル
4function loadHtmlUtf8(string $html): ?DOMDocument
5{
6    $dom = new DOMDocument('1.0', 'UTF-8');
7    // libxmlのエラーを抑制
8    libxml_use_internal_errors(true);
9    
10    // HTMLを読み込む。UTF-8エンコーディングを指定
11    $dom->loadHTML('<?xml encoding="UTF-8"?>' . $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
12
13    // エラーがあれば処理 (例: ロギング)
14    if (libxml_get_errors()) {
15        // ここでエラー処理を行う (例: ロギング)
16        libxml_clear_errors();
17        return null; // または例外をスロー
18    }
19
20    return $dom;
21}
22
23// 使用例
24$html = '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>テスト</title></head><body><h1>こんにちは、世界!</h1></body></html>';
25$dom = loadHtmlUtf8($html);
26
27if ($dom) {
28    // DOMDocumentが正常に作成された場合の処理
29    echo $dom->saveHTML(); // HTMLを出力
30} else {
31    echo "HTMLの読み込みに失敗しました。";
32}
33
34?>

このサンプルコードは、PHPのDOMDocumentクラスのloadHTMLメソッドを使用して、HTML文字列をUTF-8エンコーディングでDOMDocumentオブジェクトに読み込む方法を示しています。loadHTMLメソッドは、第一引数にHTML文字列 $source を、第二引数にオプション $options を受け取ります。この例では、LIBXML_HTML_NOIMPLIEDLIBXML_HTML_NODEFDTDというオプションを指定することで、HTML構造の自動補完やDOCTYPE宣言の省略を制御しています。

loadHtmlUtf8関数は、HTML文字列を受け取り、DOMDocumentオブジェクトを返します。まず、UTF-8エンコーディングを指定してDOMDocumentオブジェクトを生成します。次に、libxml_use_internal_errors(true)でlibxmlのエラー処理を有効にし、エラーが発生した場合にlibxml_get_errors()でエラーを取得できるようにします。loadHTMLメソッドの前に <?xml encoding="UTF-8"?> を付加することで、UTF-8エンコーディングを明示的に指定します。

エラーが発生した場合は、libxml_clear_errors()でエラー情報をクリアし、nullを返します。正常にHTMLが読み込まれた場合は、DOMDocumentオブジェクトを返します。

サンプルコードでは、作成したloadHtmlUtf8関数を使用してHTML文字列を読み込み、saveHTMLメソッドでHTMLを出力しています。もしHTMLの読み込みに失敗した場合は、エラーメッセージを表示します。この方法で、UTF-8エンコーディングに対応したHTMLドキュメントをPHPで扱うことができます。

DOMDocument::loadHTMLメソッドの注意点と補足です。

loadHTMLはHTML文字列を読み込む関数ですが、文字エンコーディングに注意が必要です。サンプルコードのように、<?xml encoding="UTF-8"?>をHTMLの先頭に追加し、さらにDOMDocumentのコンストラクタでUTF-8を指定することで、UTF-8エンコーディングのHTMLを正しく処理できます。

また、libxml_use_internal_errors(true)でlibxmlのエラーを抑制し、libxml_get_errors()でエラーを確認することで、HTMLの解析エラーを適切に処理できます。LIBXML_HTML_NOIMPLIEDLIBXML_HTML_NODEFDTDオプションは、HTMLの構造をより柔軟に扱うために指定されています。エラーが発生した場合は、エラー内容をログに記録するなど、適切なエラー処理を実装してください。

関連コンテンツ

関連プログラミング言語

【PHP8.x】loadHTMLメソッドの使い方 | いっしー@Webエンジニア