Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】Dom\HTMLElement::textContentプロパティの使い方

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

作成日: 更新日:

基本的な使い方

textContentプロパティは、DOM\HTMLElementクラスに属し、指定されたHTML要素とそのすべての子孫要素が持つテキストコンテンツを保持するプロパティです。このプロパティを使用すると、HTMLタグやコメントノードを除外し、要素内の純粋な可読テキスト部分のみを取得することができます。例えば、あるHTML要素が<p>こんにちは、<b>世界</b>!</p>という内容を持っている場合、textContentプロパティを取得すると「こんにちは、世界!」という文字列が得られます。

また、このプロパティに新しい文字列を設定することで、HTML要素の内容を更新することも可能です。文字列を設定すると、対象となるHTML要素の既存の子ノードはすべて削除され、設定された新しいテキストコンテンツのみが挿入されます。この際、設定された文字列は自動的にHTMLエンティティにエスケープされることはありません。したがって、ユーザーからの入力をtextContentプロパティに直接設定する際には、クロスサイトスクリプティング(XSS)などのセキュリティ上の脆弱性を避けるため、必ず適切なエスケープ処理を行う必要があります。

このプロパティは、要素の構造そのものには影響を与えずに、その要素が持つテキスト情報のみを簡潔に扱いたい場合に非常に有用です。HTML文書の内容からテキストを抽出したり、表示されているテキストをプログラムから変更したりする際に活用されます。

構文(syntax)

1<?php
2$document = new Dom\HTMLDocument();
3
4// Dom\HTMLElement を実装する要素を作成
5// createElement('p') は Dom\HTMLParagraphElement を返し、これは Dom\HTMLElement を実装しています。
6$element = $document->createElement('p');
7
8// textContent プロパティに文字列を設定
9$element->textContent = 'PHPで設定されたテキストコンテンツ。';
10
11// textContent プロパティから文字列を取得し出力
12echo $element->textContent;
13?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

このプロパティは、要素とその子孫のすべてのテキストコンテンツを結合した文字列を返します。

サンプルコード

PHP DOM: textContentでHTMLテキストを取得する

1<?php
2
3/**
4 * Dom\HTMLElement::textContent プロパティの使用例を示す関数。
5 * HTMLドキュメントから特定のHTML要素の純粋なテキストコンテンツを抽出します。
6 *
7 * PHP 8では、新しいDom拡張が導入され、Dom\HTMLElementはHTML固有の要素を表すクラスです。
8 * 従来のDOM拡張と互換性があり、Dom\DocumentはDOMDocumentクラスを継承しています。
9 * loadHTMLなどのメソッドで取得される要素は通常DOMElementのインスタンスですが、
10 * Dom\HTMLElementもDOMElementもtextContentプロパティを持ち、同様の機能を提供します。
11 */
12function demonstrateDomHTMLElementTextContent(): void
13{
14    // 1. Dom\Document オブジェクトを作成します。
15    // これはHTMLドキュメント全体を表すオブジェクトです。
16    $document = new Dom\Document();
17
18    // 2. 解析するHTMLコンテンツをロードします。
19    // このHTMLには、テキストと子要素を持つ段落やスクリプトが含まれています。
20    $htmlString = '
21        <!DOCTYPE html>
22        <html>
23        <head>
24            <title>Dom\HTMLElement::textContent Example</title>
25        </head>
26        <body>
27            <div id="container">
28                <p class="intro">これは最初の<strong>重要な</strong>段落です。</p>
29                <p>これは2番目の段落で、<span>追加情報</span>を含みます。</p>
30            </div>
31            <script>
32                // スクリプトタグの内容もtextContentに含まれます。
33                console.log("スクリプトの内容");
34            </script>
35        </body>
36        </html>';
37
38    // loadHTML() メソッドでHTML文字列をパースし、DOMツリーを構築します。
39    $document->loadHTML($htmlString);
40
41    // 3. ドキュメントからすべての段落要素 (<p>タグ) を取得します。
42    // getElementsByTagNameはDOMNodeList (または Dom\HTMLCollection) を返し、
43    // その中の各要素はDOMElementのインスタンスとなります。
44    $paragraphs = $document->getElementsByTagName('p');
45
46    // 4. 取得した最初の段落要素から textContent プロパティにアクセスします。
47    if ($paragraphs->length > 0) {
48        $firstParagraph = $paragraphs->item(0); // 最初の <p> 要素を取得します
49
50        // $firstParagraph はDOMElementのインスタンスですが、textContentプロパティを持ちます。
51        // textContentは要素とその子孫のテキストコンテンツを結合して返します。
52        // HTMLタグ(例: <strong>)は除外され、純粋なテキストのみが取得されます。
53        $textContentFirst = $firstParagraph->textContent;
54
55        echo "最初の段落の textContent: " . $textContentFirst . "\n";
56        // 期待される出力例: "これは最初の重要な段落です。"
57
58        // 2番目の段落の textContent も取得してみます。
59        if ($paragraphs->length > 1) {
60            $secondParagraph = $paragraphs->item(1);
61            $textContentSecond = $secondParagraph->textContent;
62            echo "2番目の段落の textContent: " . $textContentSecond . "\n";
63            // 期待される出力例: "これは2番目の段落で、追加情報を含みます。"
64        }
65    } else {
66        echo "HTMLドキュメント内に段落要素が見つかりませんでした。\n";
67    }
68
69    // スクリプト要素の textContent も確認します。
70    // スクリプトタグ内のJavaScriptコードも純粋なテキストとして取得されます。
71    $scripts = $document->getElementsByTagName('script');
72    if ($scripts->length > 0) {
73        $firstScript = $scripts->item(0);
74        $scriptContent = $firstScript->textContent;
75        echo "スクリプト要素の textContent: " . $scriptContent . "\n";
76        // 期待される出力例: "                console.log("スクリプトの内容");" (先頭の空白文字を含む)
77    }
78}
79
80// 関数を実行します。
81demonstrateDomHTMLElementTextContent();

PHPのDom\HTMLElement::textContentプロパティは、指定されたHTML要素とそのすべての子孫要素が持つテキストコンテンツを結合し、純粋な文字列として取得するために利用されます。このプロパティは引数を取らず、要素内のテキストを表すstring型の値を返します。

サンプルコードでは、Dom\Documentオブジェクトを用いてHTML文字列を解析し、DOMツリーを構築しています。その後、getElementsByTagNameメソッドなどで特定のHTML要素(例えば<p>タグ)を取得し、その要素に対してtextContentプロパティへアクセスしています。これにより、「<p>これは<strong>重要な</strong>段落です。</p>」のようなHTMLから、<strong>タグなどのHTMLタグが取り除かれた「これは重要な段落です。」といった純粋なテキストを簡単に抽出できます。

また、<script>タグの内容もtextContentプロパティで取得可能です。サンプルコードでは、スクリプトタグ内のJavaScriptコードもそのままテキストとして取得される様子が示されています。PHP 8で導入された新しいDom拡張では、Dom\HTMLElementクラスがHTML要素を扱うための機能を提供し、従来のDOM拡張のDOMElementクラスと同様にtextContentプロパティを持ちます。このプロパティを使用することで、HTMLドキュメントから装飾や構造に関するタグ情報を含まない、必要なテキスト情報を正確かつ簡潔に抽出することが可能です。

textContentプロパティは、HTML要素とその子孫要素内の全てのテキスト内容を、HTMLタグを除去して純粋な文字列として取得します。HTMLの整形に使われる空白文字や改行、スクリプトタグ内のコードもテキストとしてそのまま含まれる点にご注意ください。PHP 8の新しいDom\HTMLElementクラスだけでなく、従来のDOMElementクラスでも同様に機能するため、どちらの要素型でも安心して利用できます。要素が見つからない場合などに備え、getElementsByTagNameなどの結果は必ずlengthプロパティなどで要素の存在を確認し、エラーを防ぐ安全なコードを心がけてください。

PHP DOM textContent を取得する

1<?php
2
3/**
4 * Dom\HTMLElement::textContent プロパティの使用例を示す関数です。
5 *
6 * textContent は、指定された要素とその子孫要素のテキストコンテンツを返します。
7 * HTMLタグは無視され、純粋なテキストデータのみが抽出されます。
8 * システムエンジニアを目指す初心者の方にも分かりやすいように、
9 * 簡単なHTMLドキュメントを読み込み、要素からテキストコンテンツを取得する手順を示します。
10 */
11function demonstrateTextContent(): void
12{
13    // 1. 新しいHTMLドキュメントオブジェクトを作成します。
14    // PHP 8ではDom名前空間が推奨されています。
15    $document = new Dom\HTMLDocument();
16
17    // 2. 解析するHTML文字列を定義します。
18    // この例では、strongタグを含むdiv要素を用意します。
19    $htmlString = '
20        <!DOCTYPE html>
21        <html>
22        <head>
23            <title>textContent Example</title>
24        </head>
25        <body>
26            <div id="container">
27                Hello <strong>World</strong>!
28                <span>This is a paragraph.</span>
29                <!-- コメントはtextContentには含まれません -->
30            </div>
31            <p>Another element.</p>
32        </body>
33        </html>
34    ';
35
36    // 3. HTML文字列をドキュメントオブジェクトにロードします。
37    // これにより、HTMLが解析され、DOMツリーが構築されます。
38    $document->loadHTML($htmlString);
39
40    // 4. 特定のHTML要素を選択します。
41    // querySelector メソッドはCSSセレクタを使用して要素を検索するのに便利です。
42    // ここでは、idが "container" のdiv要素を選択します。
43    $element = $document->querySelector('#container');
44
45    // 5. 選択した要素が存在し、Dom\HTMLElement のインスタンスであることを確認します。
46    // Dom\HTMLElement クラスは、HTML要素を表すための基本的なインターフェースを提供します。
47    if ($element instanceof Dom\HTMLElement) {
48        // 6. textContent プロパティにアクセスして、要素のテキストコンテンツを取得します。
49        // このプロパティは、要素内のすべてのテキストノード(子要素のテキストも含む)を
50        // 結合した文字列を返します。タグやコメントは含まれません。
51        $textContentValue = $element->textContent;
52
53        echo "選択された要素(#container)のtextContent:" . PHP_EOL;
54        echo "------------------------------------" . PHP_EOL;
55        echo $textContentValue . PHP_EOL;
56        echo "------------------------------------" . PHP_EOL;
57
58        // 期待される出力: "Hello World!This is a paragraph." (改行や余分なスペースはDOMの処理によって変わることがあります)
59        // 具体的には、HTML要素間のスペースは維持されますが、タグ自体は取り除かれます。
60        // この例では "Hello World! This is a paragraph." のようになるはずです。
61    } else {
62        echo "エラー: 指定されたIDの要素が見つかりませんでした。" . PHP_EOL;
63    }
64
65    // 別の例: pタグのtextContent
66    $pElement = $document->querySelector('p');
67    if ($pElement instanceof Dom\HTMLElement) {
68        $pTextContent = $pElement->textContent;
69        echo PHP_EOL;
70        echo "最初のp要素のtextContent:" . PHP_EOL;
71        echo $pTextContent . PHP_EOL; // 出力: "Another element."
72    }
73}
74
75// 関数を実行して、textContent の動作を確認します。
76demonstrateTextContent();
77
78?>

PHP 8におけるDom\HTMLElement::textContentプロパティは、HTMLドキュメント内の特定の要素から、その要素とそのすべての子孫要素に含まれる純粋なテキストコンテンツを取得するための機能です。このプロパティにアクセスする際に引数は必要ありません。戻り値は常に文字列(string)型で、要素内のHTMLタグやコメントはすべて無視され、表示されるテキストデータのみが連結された形で返されます。

サンプルコードでは、まずHTML文字列を読み込み、Dom\HTMLDocumentオブジェクトを作成してDOMツリーを構築します。その後、querySelectorメソッドを使用して、idが"container"の特定のdiv要素を選択しています。この選択されたDom\HTMLElementインスタンスからtextContentプロパティにアクセスすることで、div要素とその内部にあるstrongタグやspanタグの中のテキストが一つにまとめられ、HTMLタグを含まない「Hello World! This is a paragraph.」のような純粋なテキストとして取得される様子が示されています。この機能は、ウェブページから構造的な情報を除いたテキストデータのみを抽出したい場合に非常に役立ちます。

textContentは、指定された要素とその子孫要素に含まれるすべてのテキストコンテンツを、HTMLタグやコメントを除去した純粋な文字列として取得します。取得結果は、元のHTMLの視覚的な表示と異なり、すべてのテキストが連続して取得される点に注意が必要です。特に、HTML内の連続する空白や改行は、取得時に一つのスペースにまとめられたり、除去されたりすることがあります。そのため、取得したテキストを特定の形式で利用したい場合は、trim()などのPHP文字列関数で整形することをお勧めします。また、querySelectorなどで目的のHTML要素が見つからなかった場合、nullが返されることがあります。textContentにアクセスする前に、対象の変数がDom\HTMLElementのインスタンスであることを必ず確認し、要素が存在しない場合の処理を記述することで、予期せぬエラーを防ぎ、コードの安全性を高めることができます。PHP 8以降では、この例のようにDom\名前空間のクラスを使用することが推奨されています。

関連コンテンツ

関連プログラミング言語