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

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

作成日: 更新日:

基本的な使い方

doctypeプロパティは、現在のHTML文書のDoctype(文書型宣言)情報を保持するプロパティです。 このプロパティは、PHPのDOM拡張機能が提供するDom\HTMLDocumentクラスに属しています。Dom\HTMLDocumentクラスは、WebページなどのHTML文書全体をプログラムから操作するためのオブジェクトとして扱えるようにするものです。 Doctype、すなわち文書型宣言は、HTML文書がどのバージョンのHTML仕様(例えばHTML5やXHTMLなど)に基づいて作成されているかを示す非常に重要な宣言文です。ブラウザは、このDoctype情報を参照して、ページの表示方法やレンダリングモードを決定します。

doctypeプロパティを利用することで、PHPプログラム内でロードされたHTML文書が持つDoctype情報を、Dom\DocumentTypeという専用のオブジェクトとして取得することができます。このDom\DocumentTypeオブジェクトを通じて、宣言の名前、公開識別子、システム識別子といったDoctypeの具体的な内容を詳細に確認することが可能です。

システムエンジニアを目指す初心者の方々にとって、このプロパティは、Webサイトのクローラー開発やコンテンツ管理システムの構築などにおいて、HTML文書の構造をプログラム的に分析したり、特定の文書型に応じて処理を分岐させたりする際に有用です。文書の正確性を検証したり、自動で文書型を修正したりするような高度な処理を実装するための基礎として活用できます。

構文(syntax)

1<?php
2$htmlString = '<!DOCTYPE html><html><head><title>Example</title></head><body>Content</body></html>';
3
4$document = new Dom\HTMLDocument();
5$document->loadHTML($htmlString);
6
7$doctype = $document->doctype;

引数(parameters)

引数なし

引数はありません

戻り値(return)

DOMDocumentType|null

このプロパティは、DOMDocumentTypeオブジェクト、またはドキュメントタイプ宣言が存在しない場合はnullを返します。

サンプルコード

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

1<?php
2
3/**
4 * HTML文字列からDOCTYPE情報を取得し表示します。
5 *
6 * @param string $htmlContent DOCTYPEを含むHTML文字列
7 */
8function displayHtmlDoctypeInfo(string $htmlContent): void
9{
10    // Dom\HTMLDocumentはHTML5のパースを前提としたクラスです。
11    // PHP 8.4以降で利用可能です。
12    $document = new Dom\HTMLDocument();
13
14    // HTML文字列を読み込み、DOMツリーを構築します。
15    // HTML5の要素で警告が出ることがあるため、@で抑制します。
16    @$document->loadHTML($htmlContent);
17
18    // `doctype` プロパティにアクセスして、文書型宣言を取得します。
19    // ドキュメントにDOCTYPEがない場合は null が返されます。
20    $doctype = $document->doctype;
21
22    // 取得したDOCTYPEオブジェクトが存在するかどうかを確認します。
23    if ($doctype instanceof \DOMDocumentType) {
24        echo "DOCTYPE情報:\n";
25        // DOCTYPE名 (通常は "html") を出力します。
26        echo "  Name: " . htmlspecialchars($doctype->name, ENT_QUOTES, 'UTF-8') . "\n";
27        // 公開識別子 (Public ID) を出力します。HTML5では空文字列です。
28        echo "  Public ID: '" . htmlspecialchars($doctype->publicId, ENT_QUOTES, 'UTF-8') . "'\n";
29        // システム識別子 (System ID) を出力します。HTML5では空文字列です。
30        echo "  System ID: '" . htmlspecialchars($doctype->systemId, ENT_QUOTES, 'UTF-8') . "'\n";
31    } else {
32        echo "このドキュメントにDOCTYPEは見つかりませんでした。\n";
33    }
34}
35
36// サンプルとして使用するHTML5の文字列
37$html = <<<HTML
38<!DOCTYPE html>
39<html lang="ja">
40<head>
41    <meta charset="UTF-8">
42    <title>DOCTYPEのサンプル</title>
43</head>
44<body>
45    <h1>こんにちは、世界!</h1>
46</body>
47</html>
48HTML;
49
50// 関数を実行してDOCTYPE情報を表示します。
51displayHtmlDoctypeInfo($html);
52
53?>

このサンプルコードは、PHPのDOM拡張機能を使用し、与えられたHTML文字列からDOCTYPE(文書型宣言)情報を取得・表示する方法を示しています。まず、Dom\HTMLDocumentクラスのインスタンスを作成します。このクラスは、HTML5の文書をパースするために特化しており、PHP 8.4以降で利用可能です。loadHTML()メソッドにHTML文字列を渡すことで、DOMツリーが構築されます。

その後、$document->doctypeプロパティにアクセスすることで、文書のDOCTYPE情報が取得できます。このプロパティは引数を取らず、DOCTYPEが見つかればDOMDocumentTypeオブジェクトを、見つからなければnullを返します。取得した$doctypeDOMDocumentTypeのインスタンスであれば、そのname(通常「html」)、publicIdsystemIdといったプロパティを通じて詳細な情報を表示しています。HTML5ではpublicIdsystemIdは通常空文字列となります。

このコードは、HTML文書のDOCTYPE情報をプログラムから取得し、文書の構造や標準準拠状況を把握する際に役立ちます。

Dom\HTMLDocumentはHTML5を扱うためのクラスです。DOCTYPEの取得には$document->doctypeを使用します。DOCTYPEが存在しない場合、nullが返る点に注意してください。HTML文字列の読み込みにはloadHTMLを使いますが、HTML5の要素によっては警告が出ることがあります。@マークでエラー表示を抑制できますが、根本的な解決にはなりません。DOCTYPEの情報を出力する際は、htmlspecialcharsでエスケープ処理を行い、XSS対策を施してください。サンプルのHTML変数は、あくまで一例です。実際のHTML構造に合わせて適切に調整してください。PHP 8.4以降で利用可能です。

PHPでHTMLのDOCTYPEを取得する

1<?php
2
3// DOMDocument を作成します。
4$dom = new DOMDocument('1.0', 'UTF-8');
5
6// HTMLDocumentを作成します。
7$html = new DOM\HTMLDocument();
8
9// HTMLをロードします。(ここでは簡略化のため文字列で直接指定)
10$html->loadHTML('<!DOCTYPE html><html><head><title>Example</title></head><body><h1>Hello, World!</h1></body></html>');
11
12// doctype プロパティを取得します。
13$doctype = $html->doctype;
14
15// doctype が存在する場合、名前を表示します。
16if ($doctype) {
17    echo "Doctype Name: " . $doctype->name . PHP_EOL; // 出力例:Doctype Name: html
18} else {
19    echo "No doctype found." . PHP_EOL;
20}
21
22// PDF出力に関する操作は、この doctype プロパティ自体からは直接行えません。
23// PDF出力を行う場合は、別途ライブラリ (例: TCPDF, mPDF) を使用する必要があります。
24// DOMDocument を PDF ライブラリに渡して、PDF を生成することになります。
25// 以下は、その概念を示す疑似コードです。
26/*
27use TCPDF;
28
29$pdf = new TCPDF();
30$pdf->AddPage();
31
32// DOMDocumentの内容をPDFに変換する処理 (実際のライブラリのAPIを使用)
33// $pdf->writeHTML($dom->saveHTML()); // これは例であり、具体的なAPIはライブラリに依存します。
34
35$pdf->Output('example.pdf', 'I'); // ブラウザで表示
36*/
37?>

このPHPのサンプルコードは、Dom\HTMLDocumentクラスのdoctypeプロパティの使い方を示しています。doctypeプロパティは、HTMLドキュメントのDOCTYPE宣言を表すDOMDocumentTypeオブジェクトを返します。もしDOCTYPE宣言が存在しない場合は、nullを返します。

まず、DOMDocumentDOM\HTMLDocumentのインスタンスを作成し、loadHTMLメソッドを使ってHTMLコンテンツを読み込みます。この例では、簡略化のためにHTML文字列を直接指定していますが、ファイルから読み込むことも可能です。

次に、$html->doctypedoctypeプロパティにアクセスし、DOCTYPE宣言を取得します。DOCTYPE宣言が存在する場合は、$doctype->nameでDOCTYPEの名前(例: "html")を表示します。存在しない場合は、「No doctype found.」と表示されます。

コード例の後半には、PDF出力に関する記述がありますが、doctypeプロパティ自体にはPDF出力機能はありません。PHPでPDFを生成するには、TCPDFやmPDFなどの専用ライブラリを使用する必要があります。これらのライブラリを用いて、DOMDocumentオブジェクトの内容をPDF形式に変換し、出力します。サンプルコード内のコメントアウトされた部分は、PDFライブラリを用いた場合の概念的な記述例を示しています。

DOM\HTMLDocumentdoctypeプロパティは、ドキュメントのDOCTYPE宣言を表すオブジェクトを返します。DOCTYPEが存在しない場合はnullを返します。このプロパティ自体は、DOCTYPEの情報を取得するだけで、DOCTYPEの変更やPDF出力などの操作は直接行えません。

PDF出力を行うには、別途PDF生成ライブラリ(TCPDF、mPDFなど)を利用する必要があります。DOMDocumentオブジェクトをPDFライブラリに渡し、ライブラリのAPIを使ってHTMLの内容をPDFに変換します。サンプルコード内のコメントにある疑似コードは概念的なものであり、実際のAPIの利用方法は各ライブラリのドキュメントを参照してください。また、HTMLの構造によってはPDFライブラリが正しく変換できない場合があるため、注意が必要です。

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