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

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

作成日: 更新日:

基本的な使い方

textContentプロパティは、DOMDocumentTypeクラスに属し、このノードおよびその子孫のテキストコンテンツを保持するプロパティです。PHPのDOM拡張において、DOMDocumentTypeはHTMLやXMLドキュメントのDOCTYPE宣言、例えば <!DOCTYPE html> のような情報を表します。このDOCTYPE宣言は、ドキュメントのタイプやDTD(Document Type Definition)への参照を定義するためのものであり、一般的なHTML要素やXML要素のように、内部にテキストデータや子孫ノードを持つことを意図していません。

そのため、DOMDocumentTypeオブジェクトのtextContentプロパティにアクセスしても、常に空の文字列が返されます。この挙動は、DOMElementDOMTextのような他の種類のノードが、実際にその内部に存在するテキストデータをこのプロパティに保持するのとは対照的です。初心者の方にとっては、textContentプロパティがすべてのノードタイプで同じように動作するわけではないという点を理解しておくことが重要です。

DOMDocumentTypeに関する具体的な情報、例えばドキュメントタイプの名前 (htmlなど) や公開識別子、システム識別子といった値を取得したい場合は、DOMDocumentTypeクラスが提供するnamepublicIdsystemIdといった他の専用プロパティをご利用ください。textContentは、DOMDocumentTypeの目的から見ても、利用されることはありません。

構文(syntax)

1<?php
2$dom = new DOMDocument();
3$dom->loadHTML('<!DOCTYPE html><html><body></body></html>');
4$documentTypeNode = $dom->doctype;
5
6$textContentValue = $documentTypeNode->textContent;
7
8echo $textContentValue;
9?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string|null

DOMDocumentTypeノードとその子孫ノードのすべての子テキストノードの連結された内容を文字列として返します。ノードにテキストコンテンツがない場合は null を返します。

サンプルコード

PHP DOMDocument textContent を理解する

1<?php
2
3/**
4 * DOMDocumentType::textContent プロパティの基本的な使い方を示すサンプルコードです。
5 * システムエンジニアを目指す初心者にも分かりやすいように、HTMLドキュメントから
6 * DOCTYPEノードのテキストコンテンツを取得し、その動作を説明します。
7 */
8function demonstrateDomDocumentTypeTextContent(): void
9{
10    // 新しいDOMDocumentオブジェクトを作成します。
11    $dom = new DOMDocument();
12
13    // HTML5の簡単なドキュメント文字列を定義します。
14    // この例では、標準的なHTML5のDOCTYPEを使用します。
15    $html = '<!DOCTYPE html>
16             <html>
17             <head>
18                 <title>サンプルページ</title>
19             </head>
20             <body>
21                 <h1>こんにちは、世界!</h1>
22             </body>
23             </html>';
24
25    // HTML文字列をDOMDocumentに読み込みます。
26    // PHPはHTMLのパースエラーに対して警告を発することがあります。
27    // 初心者向けに、ここでは '@' を付けて警告を抑制していますが、
28    // 実際のアプリケーションでは、エラーハンドリングを適切に行うことを推奨します。
29    @$dom->loadHTML($html);
30
31    // ドキュメントからDOCTYPEノードを取得します。
32    // DOMDocumentTypeオブジェクトは、DOMDocument::doctypeプロパティでアクセスできます。
33    $docType = $dom->doctype;
34
35    if ($docType !== null) {
36        echo "DOCTYPEノードが見つかりました。\n";
37
38        // DOMDocumentTypeノードの textContent プロパティにアクセスします。
39        // textContentは、ノードとその子孫の結合されたテキストコンテンツを返します。
40        // DOCTYPEノード自体は、通常、直接の子ノードとしてテキストコンテンツを持たないため、
41        // このプロパティは多くの場合、nullまたは空文字列を返します。
42        $textContent = $docType->textContent;
43
44        echo "DOMDocumentType::textContent の値: ";
45        if ($textContent === null) {
46            echo "null\n";
47        } elseif ($textContent === '') {
48            echo "空文字列 (empty string)\n";
49        } else {
50            // DOCTYPEノードで意味のあるtextContentが返されることは稀ですが、
51            // 型の定義 (string|null) に基づき、この可能性も示します。
52            echo "'" . $textContent . "'\n";
53        }
54
55        echo "\n補足:\n";
56        echo "DOCTYPEノード(例: <!DOCTYPE html>)は、文書の型を宣言するものです。\n";
57        echo "このノードは、通常テキストデータを保持しないため、"
58             . "textContentプロパティは 'null' または空文字列を返すことが多いです。\n";
59
60    } else {
61        echo "DOCTYPEノードが見つかりませんでした。\n";
62        echo "これは、ドキュメントにDOCTYPE宣言がないか、パースに失敗した可能性があります。\n";
63    }
64}
65
66// 関数を実行して、DOMDocumentType::textContentの動作を確認します。
67demonstrateDomDocumentTypeTextContent();

DOMDocumentType::textContentは、PHPのDOM拡張機能で提供されるプロパティで、HTMLやXMLドキュメントにおけるDOCTYPEノードのテキストコンテンツを取得するために使用されます。このプロパティは引数を取らず、戻り値としてstring型またはnullを返します。

このサンプルコードでは、まずDOMDocumentオブジェクトを作成し、簡単なHTML5ドキュメントを読み込んでいます。その後、$dom->doctypeプロパティを通じてドキュメントのDOCTYPEノードを取得し、それが存在するか確認しています。

DOCTYPEノードが見つかった場合、$docType->textContentにアクセスしてその値を取得し、表示しています。DOCTYPEノード(例: <!DOCTYPE html>)は、文書の型を宣言するメタ情報であり、一般的な要素ノードのように内部にテキストデータを持つことは通常ありません。そのため、textContentプロパティは多くの場合nullまたは空文字列を返します。これは、DOCTYPEが直接的なテキスト内容を持たないため、このプロパティがnullや空文字列を返すのは予期された挙動となります。

DOMDocumentType::textContentプロパティは、DOCTYPE宣言ノードのテキストコンテンツを返しますが、通常はnullまたは空文字列になります。これはDOCTYPE宣言が文書の型を示す構造であり、直接のテキストデータを持たないためです。サンプルコードで用いた@記号によるエラー抑制は、初心者向けの一時的な措置であり、実際のシステム開発ではエラーの原因究明や適切なエラーハンドリングを行うことが非常に重要です。また、DOMDocument::doctypeで取得したノードがnullでないか必ず確認し、安全に処理を進めるようにしましょう。

PHP DOM: textContent vs nodeValue

1<?php
2
3/**
4 * DOMNode の textContent と nodeValue の違いを示すサンプルコードです。
5 *
6 * 特に DOMDocumentType の textContent に焦点を当てつつ、
7 * キーワードである nodeValue と textContent の一般的な違いも示します。
8 *
9 * textContent: そのノードとそのすべての子孫ノードのテキストコンテンツを連結したもの。
10 *              要素ノード内のタグは無視されます。
11 * nodeValue: そのノード自身の値を返します。
12 *            要素ノードの場合、通常は null です。
13 *            テキストノードの場合、そのテキスト内容を返します。
14 *            DOMDocumentType の場合、DTDの内部サブセットを表すことがあります(多くの場合 null または空文字列)。
15 *
16 * @return void
17 */
18function showDomNodeValueVsTextContent(): void
19{
20    // DTD (Document Type Declaration) を含む HTML 文書を準備します。
21    // DOMDocumentType の textContent は通常空文字列または null です。
22    // nodeValue も多くの場合、空文字列または null ですが、DTD情報を持つ場合に値を持つことがあります。
23    $htmlContent = <<<'HTML'
24<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
25<html>
26<head>
27    <title>DOM 例</title>
28</head>
29<body>
30    <div id="main-content">
31        これは <strong>重要な</strong> 情報です。
32        <p>
33            さらに、<em>追加の</em> テキストがあります。
34        </p>
35    </div>
36    <p>単一のテキストノード。</p>
37</body>
38</html>
39HTML;
40
41    $dom = new DOMDocument('1.0', 'UTF-8');
42    // loadHTML は外部エンティティをロードしようとすることがあり、警告を出す場合があります。
43    // 初心者向けには、エラー抑制演算子 @ を使用して表示を簡潔にします。
44    @$dom->loadHTML($htmlContent, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
45
46    echo "--- DOMDocumentType の textContent と nodeValue ---" . PHP_EOL;
47    $doctype = $dom->doctype;
48
49    if ($doctype instanceof DOMDocumentType) {
50        echo "DOMDocumentType 名前: " . ($doctype->name ?? 'null') . PHP_EOL;
51        echo "DOMDocumentType Public ID: " . ($doctype->publicId ?? 'null') . PHP_EOL;
52        echo "DOMDocumentType System ID: " . ($doctype->systemId ?? 'null') . PHP_EOL;
53        // DOMDocumentType の textContent は通常空文字列か null
54        echo "DOMDocumentType -> textContent: '" . ($doctype->textContent ?? 'null') . "'" . PHP_EOL;
55        // DOMDocumentType の nodeValue も多くの場合、空文字列か null
56        echo "DOMDocumentType -> nodeValue: '" . ($doctype->nodeValue ?? 'null') . "'" . PHP_EOL;
57        echo PHP_EOL;
58    } else {
59        echo "ドキュメントタイプ宣言 (DOMDocumentType) は見つかりませんでした。" . PHP_EOL . PHP_EOL;
60    }
61
62    echo "--- 一般的な要素ノード (DOMElement) での比較 ---" . PHP_EOL;
63
64    // ID 'main-content' を持つ要素を取得
65    $mainContent = $dom->getElementById('main-content');
66
67    if ($mainContent instanceof DOMElement) {
68        echo "要素 '<div id=\"main-content\">...' のコンテンツ:" . PHP_EOL;
69        // C14N() は要素の内容(タグも含む)を正規化されたXMLとして出力し、視覚的な比較に役立ちます。
70        echo "  " . str_replace("\n", "\n  ", trim($mainContent->C14N())) . PHP_EOL;
71
72        // textContent は子孫ノードすべてのテキストを連結します。
73        echo "textContent: '" . $mainContent->textContent . "'" . PHP_EOL;
74
75        // 要素ノードの nodeValue は通常 null です。
76        echo "nodeValue: '" . ($mainContent->nodeValue ?? 'null') . "'" . PHP_EOL;
77        echo PHP_EOL;
78
79        // ネストされた <p> 要素を取得
80        $paragraph = $mainContent->getElementsByTagName('p')->item(0);
81        if ($paragraph instanceof DOMElement) {
82            echo "要素 '<p>...</p>' のコンテンツ:" . PHP_EOL;
83            echo "  " . str_replace("\n", "\n  ", trim($paragraph->C14N())) . PHP_EOL;
84
85            echo "textContent: '" . $paragraph->textContent . "'" . PHP_EOL;
86            echo "nodeValue: '" . ($paragraph->nodeValue ?? 'null') . "'" . PHP_EOL;
87            echo PHP_EOL;
88        }
89    } else {
90        echo "ID 'main-content' を持つ要素が見つかりませんでした。" . PHP_EOL . PHP_EOL;
91    }
92
93    echo "--- テキストノード (DOMText) での比較 ---" . PHP_EOL;
94
95    // 文書内の最初の <p> 要素のテキストノードを取得
96    $firstParagraph = $dom->getElementsByTagName('p')->item(1); // 2つ目の <p>
97    if ($firstParagraph instanceof DOMElement && $firstParagraph->firstChild instanceof DOMText) {
98        $textNode = $firstParagraph->firstChild;
99
100        echo "テキストノードの内容: '" . $textNode->nodeValue . "'" . PHP_EOL;
101        // テキストノードの場合、textContent と nodeValue は同じ値を返します。
102        echo "textContent: '" . $textNode->textContent . "'" . PHP_EOL;
103        echo "nodeValue: '" . $textNode->nodeValue . "'" . PHP_EOL;
104    } else {
105        echo "テキストノードが見つかりませんでした。" . PHP_EOL;
106    }
107    echo "---------------------------------------------------" . PHP_EOL;
108}
109
110// サンプル関数を実行
111showDomNodeValueVsTextContent();

DOMDocumentTypeクラスのtextContentプロパティは、そのノードのテキストコンテンツを文字列またはnullで返します。引数は必要ありません。DOMDocumentTypeはHTMLやXMLの文書型定義(DTD)に関する情報を格納するノードであり、このプロパティが返す値は通常、空文字列かnullになることが多いです。

このtextContentと、よく比較されるnodeValueには重要な違いがあります。textContentは、対象ノードとその全ての子孫ノードに含まれるテキストコンテンツを、HTMLタグなどを無視して連結したものを取得します。対してnodeValueは、そのノード自身の値を返します。そのため、一般的なHTML要素ノードではnodeValueは通常nullを返しますが、テキストノードの場合にはそのテキスト内容を返します。

サンプルコードでは、まずDOMDocumentTypeの場合で、両プロパティが通常空になることを確認できます。さらに、HTML要素ノードではtextContentが子孫を含む全テキストを、nodeValueがnullを返す様子を示し、テキストノードにおいては両プロパティが同じテキスト内容を返すことで、それぞれのプロパティの具体的な挙動を理解しやすくしています。これにより、各ノードタイプに応じた適切なプロパティの選択が可能です。

DOMDocumentTypeのtextContentとnodeValueは、多くの場合、空文字列またはnullになる点に注意してください。textContentは要素ノードとその全ての子孫のテキスト内容を連結して取得するのに対し、nodeValueはノード自身の値を返し、要素ノードでは通常nullです。しかし、テキストノードにおいてはtextContentとnodeValueは同じ値を返します。DOMDocument::loadHTMLで外部エンティティのロード警告を避けるため@を使っていますが、本番環境ではエラーを適切に処理することが重要です。取得した値がnullの場合に備え、?? 'null'のようなnull合体演算子で代替値を指定すると、予期せぬエラーを防ぎ、安全なコードになります。

関連コンテンツ

関連プログラミング言語