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

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

作成日: 更新日:

基本的な使い方

textContentプロパティは、Dom\HTMLDocumentクラスのインスタンスが表すHTML文書、またはその内部の特定のノードに含まれる純粋なテキストコンテンツを保持するプロパティです。

Dom\HTMLDocumentクラスは、PHPのDOM(Document Object Model)拡張機能の一部であり、HTML文書全体をオブジェクトとして表現し、その構造や内容をプログラムから操作するための基盤を提供します。このクラスを通じて、HTML文書の解析、要素の追加・削除、属性の変更など、多岐にわたる操作が可能です。

textContentプロパティは、指定されたノードとそのすべての子孫ノードが持つテキストデータを、HTMLタグやコメントを除外して、一つの連続した文字列として扱います。例えば、HTML文書全体に対してこのプロパティを読み取ると、その文書に含まれるすべての目に見えるテキストが結合された文字列が得られます。この際、&lt;のようなHTMLエンティティは自動的に<といった通常の文字にデコードされます。

このプロパティに新しい文字列を設定することも可能です。設定された場合、対象となるノードの既存の子ノード(テキストノード、要素ノードなどすべて)は完全に削除され、新たに提供された文字列が単一のテキストノードとしてノードの子に追加されます。これにより、HTML要素の内容をマークアップなしで手軽に更新できます。

textContentは、HTML文書から純粋なテキストコンテンツだけを抽出したい場合や、要素の表示テキストをプログラム的に一括で変更したい場合に非常に便利です。HTMLマークアップを含んだ内容を操作するinnerHTMLプロパティとは異なり、純粋なテキストのみに焦点を当てており、セキュリティ上のリスクを低減しつつ、テキストコンテンツを効率的に扱えます。

構文(syntax)

1<?php
2
3$document = new Dom\HTMLDocument();
4$document->loadHTML('<html><body><p>Example <b>text</b>.</p></body></html>');
5$text = $document->textContent;
6echo $text;
7
8?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

Dom\HTMLDocumentクラスのtextContentプロパティは、そのノードとそのすべての子孫ノードのテキストコンテンツを文字列として返します。HTMLタグやコメントは含まれません。

サンプルコード

PHP DOMDocumentのtextContentを取得する

1<?php
2
3/**
4 * Dom\HTMLDocument::textContent プロパティの使用例を示します。
5 * textContent は、要素とそのすべての子孫のテキストコンテンツを結合して返します。
6 * HTMLタグ、属性、コメントは結果の文字列から除外されます。
7 */
8function demonstrateHtmlDocumentTextContent(): void
9{
10    // 新しい HTML ドキュメントインスタンスを作成します。
11    // Dom\HTMLDocument は PHP 8.2 以降で利用可能な新しい DOM API の一部です。
12    $document = new Dom\HTMLDocument();
13
14    // ロードするサンプル HTML コンテンツ。
15    $html = <<<HTML
16    <!DOCTYPE html>
17    <html>
18    <head>
19        <title>サンプルページ</title>
20    </head>
21    <body>
22        <h1>ようこそ!</h1>
23        <p>これは <b>強調された</b> <span>テキスト</span> です。</p>
24        <!-- このコメントは無視されます -->
25        <div>
26            <p>ネストされた段落1</p>
27            <p>ネストされた段落2</p>
28        </div>
29        <p style="display: none;">このテキストは表示されません。</p>
30    </body>
31    </html>
32    HTML;
33
34    // HTML コンテンツをドキュメントにロードします。
35    $document->loadHTML($html);
36
37    // ドキュメントから最初の 'body' 要素を取得します。
38    // getElementsByTagName は Dom\HTMLCollection を返し、item(0) で最初の要素を取得します。
39    $bodyElement = $document->getElementsByTagName('body')->item(0);
40
41    // body 要素が存在するか確認してから処理を進めます。
42    if ($bodyElement) {
43        // body 要素の textContent プロパティにアクセスします。
44        // 結果として、すべての HTML タグ、属性、コメントが取り除かれた純粋なテキストが結合されて返されます。
45        $textContent = $bodyElement->textContent;
46
47        // 抽出されたテキストコンテンツを出力します。
48        echo $textContent . "\n";
49    } else {
50        // body 要素が見つからない場合の処理 (例: 不正な形式の HTML)。
51        echo "エラー: HTML ドキュメント内に 'body' 要素が見つかりませんでした。\n";
52    }
53}
54
55// デモンストレーション関数を実行します。
56demonstrateHtmlDocumentTextContent();
57
58?>

Dom\HTMLDocumentクラス(PHP 8.2以降で導入された新しいDOM APIの一部)のtextContentプロパティは、HTML要素とそのすべての子孫要素から純粋なテキストコンテンツを抽出する際に使用されます。このプロパティは引数を必要とせず、HTMLタグ、属性、コメントなどを除外して結合されたテキストコンテンツをstring型で返します。

サンプルコードでは、まずDom\HTMLDocumentのインスタンスを作成し、HTMLコンテンツを読み込んでいます。その後、ドキュメントからbody要素を取得し、そのtextContentプロパティにアクセスします。これにより、body要素内のすべての見出しや段落、ネストされた要素のテキストが連結され、HTML構造情報を含まない純粋なテキストデータが抽出されます。このプロパティは、HTMLドキュメントからテキスト情報のみを取得したい場面で大変役立ちます。

このサンプルコードは、HTMLコンテンツから視覚的なタグ、属性、コメントを完全に除外した純粋なテキストを効率的に抽出するtextContentプロパティの利用法を示しています。抽出されるテキストには、元のHTMLの改行や連続する空白文字がそのまま反映されるため、必要に応じて文字列の整形を行うと良いでしょう。

特に注意すべき点として、Dom\HTMLDocumentクラスはPHP 8.2以降で導入された比較的新しいAPIですので、実行環境のPHPバージョンをご確認ください。また、getElementsByTagNameなどのメソッドが目的の要素を見つけられなかった場合、item(0)nullを返します。このため、サンプルコードのようにif ($bodyElement)で要素の存在を確認する処理は、予期せぬエラーを防ぎ、コードを安全に実行するために非常に重要です。

PHP DOM textContent でHTMLテキスト取得

1<?php
2
3/**
4 * Dom\HTMLDocument::textContent プロパティの使用例を示す関数。
5 *
6 * この関数は、HTML文字列をロードし、Dom\HTMLDocument オブジェクト全体の
7 * テキストコンテンツを取得して表示します。
8 * textContent は、HTMLタグを除いたすべてのテキストノードの内容を連結したものです。
9 */
10function demonstrateHtmlDocumentTextContent(): void
11{
12    // 新しい Dom\HTMLDocument インスタンスを作成します。
13    $document = new Dom\HTMLDocument();
14
15    // 解析するためのHTML文字列を定義します。
16    $htmlString = <<<HTML
17<!DOCTYPE html>
18<html>
19<head>
20    <title>サンプルページ</title>
21</head>
22<body>
23    <h1>こんにちは、PHP DOM!</h1>
24    <p>これは <strong>Dom\HTMLDocument::textContent</strong> プロパティの<em>基本的な使用例</em>です。</p>
25    <p>改行や余分な空白も、おおむね維持されて抽出されます。</p>
26    <!-- このコメントはテキストコンテンツには含まれません -->
27</body>
28</html>
29HTML;
30
31    // 定義したHTML文字列をドキュメントにロードします。
32    // これにより、HTMLが解析され、DOMツリーが構築されます。
33    $document->loadHTML($htmlString);
34
35    // ドキュメント全体のテキストコンテンツを取得し、表示します。
36    // textContent は、要素内のすべてのテキストコンテンツを連結して返します。
37    // HTMLタグ (例: <h1>, <p>, <strong>) やコメントノードは結果に含まれません。
38    echo "--- ドキュメント全体のテキストコンテンツ ---" . PHP_EOL;
39    echo $document->textContent . PHP_EOL;
40    echo "------------------------------------------" . PHP_EOL;
41}
42
43// 上記の関数を実行して、サンプルコードを動作させます。
44demonstrateHtmlDocumentTextContent();
45
46?>

PHP 8のDom\HTMLDocument::textContentプロパティは、HTMLドキュメントから純粋なテキスト情報を抽出するために使用されます。このプロパティにアクセスすると、HTMLドキュメント全体に含まれるすべてのテキストコンテンツが、HTMLタグ(例: <h1>, <p>, <strong>)やコメントを除いた形で、一つの連結された文字列として取得できます。

この機能は、ウェブページの本文から見出しや段落のテキストだけを取り出したり、コンテンツの概要を把握したりする際に非常に便利です。例えば、ウェブページの情報を分析したり、特定のキーワードを検索したりする目的で、HTML構造からテキスト部分だけを分離したい場合に役立ちます。

サンプルコードでは、まずHTML文字列を定義し、それをDom\HTMLDocumentオブジェクトに読み込みます。その後、$document->textContentを通じてドキュメント全体のテキストコンテンツにアクセスしています。実行結果を見ると、<h1><p>などのHTMLタグ、そしてコメントノードは出力されず、純粋な文章部分のみが表示されることが確認できます。

このtextContentプロパティは、追加の「引数」を必要とせず、常にドキュメント内のテキストコンテンツを連結した「string(文字列)」として「戻り値」を返します。HTMLの構造を意識せずに、その中身のテキストだけを手早く取得したい場合に有効なプロパティです。

Dom\HTMLDocument::textContentプロパティは、HTMLドキュメントや要素内のすべてのHTMLタグ、およびコメントノードを除外した、純粋なテキストコンテンツを連結して抽出します。このプロパティは、HTMLの構造や装飾ではなく、文書内に含まれる生のテキスト情報のみが必要な場合に非常に便利です。抽出されるテキストは、元のHTMLに含まれる改行やスペースをある程度維持しますが、HTMLエンティティ(例: &amp;&lt;)はデコードされずにそのままの形式で取得されますので、必要に応じて別途デコード処理を行ってください。また、このプロパティを使用する前には、必ずloadHTMLなどのメソッドでHTMLドキュメントを正しくロードしておく必要があります。ロードが完了していない状態でアクセスすると、結果は空文字列となりますのでご注意ください。

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