【PHP8.x】doctypeプロパティの使い方

doctypeプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

DOMDocumentクラスのdoctypeプロパティは、ドキュメントに関連付けられたDOMDocumentTypeノードを保持するプロパティです。DOMDocumentTypeノードは、XMLドキュメントのDOCTYPE宣言を表し、ドキュメントの構造と有効性に関する情報を提供します。

このプロパティは読み取り専用であり、DOMDocumentオブジェクトが作成された際に、ドキュメントにDOCTYPE宣言が含まれている場合にのみ設定されます。DOCTYPE宣言が存在しない場合、doctypeプロパティはnullを返します。

doctypeプロパティを使用することで、DOCTYPE宣言に含まれる名前、公開識別子、システム識別子などの情報にアクセスできます。これらの情報は、ドキュメントの検証や特定のDTD(Document Type Definition)への準拠を確認する際に役立ちます。

例えば、DOCTYPE宣言が<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">である場合、doctypeプロパティを通じて、DOCTYPEの名前(この場合は"html")、公開識別子(この場合は"-//W3C//DTD HTML 4.01 Transitional//EN")、システム識別子(この場合は"http://www.w3.org/TR/html4/loose.dtd")を取得できます。

doctypeプロパティは、XMLドキュメントをプログラムで処理し、その構造や有効性を検証する際に重要な役割を果たします。特に、外部DTDを参照するドキュメントを扱う場合、このプロパティを使用してDOCTYPE宣言の情報を取得し、適切な処理を行うことができます。システムエンジニアがXMLドキュメントを扱うシステムを開発する際には、doctypeプロパティの存在と役割を理解しておくことが重要です。

構文(syntax)

1DOMDocument::$doctype;

引数(parameters)

引数なし

引数はありません

戻り値(return)

DOMImplementation

DOMDocumentオブジェクトが表現している文書のDOCTYPE宣言をDOMImplementationオブジェクトとして返します。

サンプルコード

PHPでHTMLのDOCTYPE情報を取得する

1<?php
2
3/**
4 * 指定されたHTML文字列からDOCTYPE情報を抽出し、表示します。
5 *
6 * この関数は、DOMDocumentクラスを使用してHTMLをパースし、
7 * そのdoctypeプロパティからDocument Type Definition (DTD) の情報を取得します。
8 * 主にHTMLドキュメントがどのようなDTDを使用しているかを確認するのに役立ちます。
9 *
10 * @param string $htmlString 処理するHTMLコンテンツを含む文字列。
11 * @return void
12 */
13function displayHtmlDoctypeInfo(string $htmlString): void
14{
15    // DOMDocumentオブジェクトを初期化します。
16    // このオブジェクトはHTMLやXMLドキュメントをパースし、操作するために使われます。
17    $dom = new DOMDocument();
18
19    // HTML文字列をロードします。
20    // loadHTMLは成功した場合にtrue、失敗した場合にfalseを返します。
21    // libxmlのエラーは、通常、標準エラー出力に報告されます。
22    // 初心者にも分かりやすくするため、エラー抑制(@)は行わず、
23    // HTMLのロード失敗を直接検出します。
24    if (!$dom->loadHTML($htmlString)) {
25        echo "エラー: HTMLのロードに失敗しました。\n";
26        return;
27    }
28
29    // DOMDocumentのdoctypeプロパティにアクセスして、
30    // ドキュメントのDOCTYPEを表すDOMDocumentTypeオブジェクトを取得します。
31    // DOCTYPEが存在しない場合、このプロパティはnullになります。
32    $doctype = $dom->doctype;
33
34    // DOCTYPEが存在するかどうかを確認します。
35    if ($doctype instanceof DOMDocumentType) {
36        echo "DOCTYPE情報:\n";
37        // DOCTYPEの名前(例: html)を表示します。
38        echo "  名前 (name): " . ($doctype->name ?? 'N/A') . "\n";
39        // 公開識別子 (PUBLIC ID) を表示します。HTML5では通常空文字列です。
40        echo "  公開識別子 (publicId): " . ($doctype->publicId ?? 'N/A') . "\n";
41        // システム識別子 (SYSTEM ID) を表示します。HTML5では通常空文字列です。
42        echo "  システム識別子 (systemId): " . ($doctype->systemId ?? 'N/A') . "\n";
43        // internalSubsetはDTDの内部サブセット(定義)がある場合に利用されますが、
44        // 一般的なHTMLではほとんど使用されません。
45        // echo "  内部サブセット (internalSubset): " . ($doctype->internalSubset ?? 'N/A') . "\n";
46    } else {
47        echo "DOCTYPE情報が見つかりませんでした。\n";
48    }
49}
50
51// HTML5のDOCTYPE宣言を含むシンプルなHTML文字列の例
52$html5Document = '<!DOCTYPE html>
53<html>
54<head>
55    <meta charset="utf-8">
56    <title>HTML5サンプル</title>
57</head>
58<body>
59    <h1>HTML5ドキュメント</h1>
60    <p>これはHTML5の標準的なDOCTYPEです。</p>
61</body>
62</html>';
63
64echo "--- HTML5 ドキュメントの例 ---\n";
65displayHtmlDoctypeInfo($html5Document);
66echo "\n";
67
68// DOCTYPE宣言を含まないHTML文字列の例
69$noDoctypeDocument = '<html>
70<head>
71    <title>DOCTYPEなし</title>
72</head>
73<body>
74    <p>このドキュメントにはDOCTYPE宣言がありません。</p>
75</body>
76</html>';
77
78echo "--- DOCTYPEなしドキュメントの例 ---\n";
79displayHtmlDoctypeInfo($noDoctypeDocument);
80echo "\n";
81
82// 古いHTML 4.01 Strict のDOCTYPE宣言を含むHTML文字列の例
83$html4StrictDocument = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
84<html>
85<head>
86    <title>HTML 4.01 Strict サンプル</title>
87</head>
88<body>
89    <h1>HTML 4.01 Strict ドキュメント</h1>
90    <p>このDOCTYPEでは公開識別子とシステム識別子が存在します。</p>
91</body>
92</html>';
93
94echo "--- HTML 4.01 Strict ドキュメントの例 ---\n";
95displayHtmlDoctypeInfo($html4StrictDocument);

このサンプルコードは、PHPのDOMDocumentクラスを用いてHTMLドキュメントのDOCTYPE(Document Type Definition)情報を抽出し、表示する方法を示しています。DOMDocumentはHTMLやXMLドキュメントをプログラムでパースし、操作するためのクラスです。

DOMDocument::doctypeプロパティは、パースされたHTMLドキュメントのDOCTYPE宣言に関する情報を持つDOMDocumentTypeオブジェクトを取得します。このオブジェクトからは、DOCTYPEの名前(例: html)、公開識別子(publicId)、システム識別子(systemId)などの詳細な情報を参照できます。ドキュメントにDOCTYPE宣言が存在しない場合、このプロパティはnullを返します。

displayHtmlDoctypeInfo関数は、引数として渡された$htmlString(解析したいHTMLコンテンツ)を受け取ります。関数内では、まずDOMDocumentオブジェクトを初期化し、loadHTMLメソッドでHTML文字列を読み込みます。HTMLのロードに失敗した場合はエラーメッセージを表示し処理を中断します。その後、$dom->doctypeプロパティにアクセスしてDOCTYPE情報を取得します。取得した値がDOMDocumentTypeオブジェクトであれば、その名前、公開識別子、システム識別子といった具体的な情報を画面に出力します。本関数はvoidを戻り値としており、処理結果は直接画面に表示されるため、値を返しません。

コードの実行例では、HTML5、DOCTYPE宣言のないHTML、および古いHTML 4.01 Strictの3つの異なるHTML文字列を使い、それぞれのDOCTYPE情報がどのように抽出され、表示されるかを確認できます。特に、HTML 4.01 Strictの例では、公開識別子やシステム識別子も表示されることが分かります。

このサンプルコードを利用する際の注意点として、まずDOMDocument::loadHTML()関数は、処理対象のHTML文字列に問題がある場合、失敗する可能性がある点に留意してください。成功したかどうかを必ず戻り値で確認し、適切にエラー処理を行うことが安全なコード運用の基本です。エラーを抑制する@演算子は、問題の原因特定を困難にするため、特に初心者の方は使用を避けましょう。

次に、DOMDocument::$doctypeプロパティは、対象のHTMLドキュメントにDOCTYPE宣言が含まれていない場合、nullを返します。そのため、プロパティから取得した値がDOMDocumentTypeのインスタンスであるか、if ($doctype instanceof DOMDocumentType)のように必ず型を確認してから、namepublicIdなどのプロパティにアクセスするようにしてください。これにより、nullからのプロパティアクセスによる致命的なエラーを防げます。

また、HTML5のDOCTYPEはシンプルですが、古いHTMLのDOCTYPEはpublicIdsystemIdを持つ場合があります。用途に応じてこれらのプロパティの有無を確認し、利用するようにしましょう。

PHP DOMDocument::doctype を使用する

1<?php
2
3/**
4 * DOMDocument の doctype プロパティの使用例を示します。
5 *
6 * この関数は、HTMLドキュメントを作成し、そのドキュメントタイプ (DOCTYPE) 宣言に関する情報を取得します。
7 * DOMDocument::doctype プロパティは、ドキュメントの DTD (Document Type Definition) を表す
8 * DOMDocumentType オブジェクトを返します。
9 * システムエンジニアを目指す初心者の方にも理解しやすいよう、具体的な例を用いています。
10 *
11 * @return void
12 */
13function demonstrateDomDocumentDoctypeProperty(): void
14{
15    // 新しいDOMDocumentインスタンスを作成します。
16    // DOMDocumentは、HTMLやXMLドキュメントをオブジェクトとして操作するためのクラスです。
17    // '1.0'はXMLのバージョン、'UTF-8'はエンコーディングを指定しています。
18    $dom = new DOMDocument('1.0', 'UTF-8');
19
20    // 出力されるHTMLを整形(インデントなどを付けて見やすくする)ように設定します。
21    $dom->formatOutput = true;
22    // 空白ノードを保持しないように設定します。HTMLを扱う場合は通常falseで問題ありません。
23    $dom->preserveWhiteSpace = false;
24
25    // サンプルとなるHTMLコンテンツを文字列として定義します。
26    // ここでは、一般的なHTML5のドキュメントタイプ宣言を含むシンプルなHTMLを用意します。
27    // `<!DOCTYPE html>` がドキュメントタイプ宣言です。
28    $htmlContent = '<!DOCTYPE html>
29<html>
30<head>
31    <title>DOMDocument::doctype プロパティのデモ</title>
32</head>
33<body>
34    <h1>DOMDocument::doctype の使用例</h1>
35    <p>このページは、ドキュメントタイプ情報を取得する方法を示します。</p>
36</body>
37</html>';
38    
39    // 定義したHTML文字列をDOMDocumentオブジェクトにロードします。
40    // loadHTML() メソッドは、成功した場合はtrue、失敗した場合はfalseを返します。
41    if ($dom->loadHTML($htmlContent)) {
42        // DOMDocument::doctype プロパティにアクセスします。
43        // このプロパティは、ドキュメントのDOCTYPEノードを表す DOMDocumentType オブジェクトを返します。
44        $doctype = $dom->doctype;
45
46        // $doctype が DOMDocumentType のインスタンスであるかを確認します。
47        // ドキュメントにDOCTYPE宣言がない場合、このプロパティはnullを返すことがあります。
48        if ($doctype instanceof DOMDocumentType) {
49            echo "--- ドキュメントタイプ情報 ---\n";
50            // doctypeの名前を取得します(例: "html")。
51            echo "名前: " . $doctype->name . "\n"; 
52            // Public IDを取得します。HTML5では通常空文字列です。
53            echo "Public ID: " . ($doctype->publicId ?: 'なし') . "\n";
54            // System IDを取得します。HTML5では通常空文字列です。
55            echo "System ID: " . ($doctype->systemId ?: 'なし') . "\n";
56            // 内部DTDサブセットを取得します(通常はHTML5では使用されません)。
57            echo "内部サブセット: " . ($doctype->internalSubset ?: 'なし') . "\n";
58            // ノードタイプを取得します。DOM_DOCUMENT_TYPE_NODE (値は10) を示します。
59            echo "ノードタイプ: " . $doctype->nodeType . " (DOM_DOCUMENT_TYPE_NODE)\n";
60            // ノード名を取得します。doctypeの名前と同じです。
61            echo "ノード名: " . $doctype->nodeName . "\n";
62        } else {
63            // ドキュメントタイプが存在しない場合、または取得できなかった場合。
64            echo "ドキュメントタイプ(DOCTYPE宣言)は存在しません、または取得できませんでした。\n";
65        }
66
67        echo "\n--- ドキュメントのHTML出力 ---\n";
68        // 処理後の(整形された)HTMLコンテンツを文字列として出力します。
69        echo $dom->saveHTML();
70    } else {
71        // HTMLコンテンツのロードに失敗した場合。
72        echo "HTMLコンテンツのロードに失敗しました。入力HTMLを確認してください。\n";
73    }
74}
75
76// 上記で定義した関数を実行し、デモンストレーションを開始します。
77demonstrateDomDocumentDoctypeProperty();
78

PHPのDOMDocument::doctypeプロパティは、HTMLやXMLドキュメントのドキュメントタイプ(DOCTYPE)宣言に関する情報を提供するものです。このプロパティは引数を必要とせず、ドキュメントに定義されたDOCTYPEノードを表すDOMDocumentTypeオブジェクトを返します。

サンプルコードでは、まずDOMDocumentインスタンスを作成し、HTML5のDOCTYPE宣言を含むHTMLコンテンツをロードしています。その後、$dom->doctypeを通じてDOMDocumentTypeオブジェクトを取得しています。このオブジェクトからは、DOCTYPEの名前(例: "html")、Public ID、System IDといった詳細な情報を取得できます。Public IDやSystem IDは、特定のDTD(Document Type Definition)を参照するために使われますが、HTML5では通常空文字列となります。

もしドキュメントにDOCTYPE宣言が存在しない場合、このプロパティはnullを返すため、利用する際はif ($doctype instanceof DOMDocumentType)のような形で、オブジェクトが有効であるかを確認することが重要です。このプロパティを利用することで、読み込んだドキュメントがどのような規約に則っているかを確認し、厳密な解析やバリデーションを行う際の基盤とすることができます。システム開発において、HTMLやXMLドキュメントの構造をプログラム的に検証する際に非常に役立つ機能です。

このサンプルコードは、HTMLドキュメントのDOCTYPE宣言情報を取得する方法を示しています。DOMDocument::doctypeプロパティは、ドキュメントにDOCTYPE宣言が存在しない場合や無効な場合にはnullを返す可能性がありますので、必ず$doctype instanceof DOMDocumentTypeでオブジェクトが正しく取得できたかを確認してください。また、loadHTMLメソッドが失敗する可能性もありますので、その戻り値の確認も重要です。HTML5のDOCTYPE宣言の場合、publicIdsystemIdプロパティは通常空文字列となりますが、これは正しい挙動です。これらの点に注意し、エラーハンドリングを適切に行うことで、安全にドキュメントの型情報を扱えます。

関連コンテンツ

関連プログラミング言語

【PHP8.x】doctypeプロパティの使い方 | いっしー@Webエンジニア