【PHP8.x】textContentプロパティの使い方
textContentプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『textContentプロパティは、DOMノードとそのすべての子孫ノードに含まれるテキストコンテンツを一つの文字列として保持するプロパティです』
このプロパティにアクセスすると、HTMLタグやXMLタグ、コメントなどをすべて取り除き、人間が読むテキスト部分だけを連結した文字列を取得できます。例えば、<p>Hello <strong>World</strong>!</p> という構造を持つ要素ノードに対してこのプロパティを参照すると、"Hello World!" という文字列が返されます。これにより、ドキュメント構造から純粋なテキスト情報のみを簡単に抽出することが可能です。
逆に、このプロパティに新しい文字列を代入すると、そのノードが持つ既存の子ノードはすべて削除され、指定された文字列を内容とする新しいテキストノードが一つだけ追加されます。この動作により、特定の要素内のコンテンツを、安全かつ簡単に新しいテキストで置き換えることができます。HTMLの特殊文字などを考慮する必要がないため、ユーザー入力のようなテキストデータを安全に表示する際に特に役立ちます。
構文(syntax)
1<?php 2// HTML文字列からDOMDocumentオブジェクトを作成します 3$html = '<div id="main"><p>これは最初の段落です。<b>太字</b>の部分もあります。</p></div>'; 4$dom = new DOMDocument(); 5$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 6 7// IDを使って特定のノードを取得します 8$node = $dom->getElementById('main'); 9 10// textContentプロパティで、ノードとその子孫のテキストコンテンツを取得します 11// -> 出力: これは最初の段落です。太字の部分もあります。 12$text = $node->textContent; 13echo $text . PHP_EOL; 14 15// textContentプロパティに新しい値を代入して、ノードの内容を上書きします 16// この操作により、元の子ノード(<p>や<b>タグ)は全て削除されます 17$node->textContent = 'これは新しいテキストコンテンツです。'; 18 19// 変更後のHTMLを出力します 20// -> 出力: <div id="main">これは新しいテキストコンテンツです。</div> 21echo $dom->saveHTML($node); 22?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string|null
DOMNodeオブジェクトで表されるノードのテキストコンテンツを文字列として返します。要素ノードの場合、子孫ノードのテキストコンテンツもすべて連結して返します。ノードがテキストコンテンツを持たない場合はnullを返します。
サンプルコード
PHP DOMDocument textContent で要素のテキストを取得する
1<?php 2 3// DOMDocumentを生成 4$dom = new DOMDocument(); 5 6// HTMLをロード 7$dom->loadHTML('<!DOCTYPE html><html><head><title>Example</title></head><body><p>Hello, world!</p></body></html>'); 8 9// <p>要素を取得 10$paragraph = $dom->getElementsByTagName('p')->item(0); 11 12// textContentプロパティを使用して、<p>要素のテキストコンテンツを取得 13$textContent = $paragraph->textContent; 14 15// 結果を出力 16echo $textContent . PHP_EOL; // Hello, world! 17 18// textContentプロパティがnullを返すケース 19$emptyElement = $dom->createElement('empty'); 20$dom->documentElement->appendChild($emptyElement); 21 22$emptyElementNode = $dom->getElementsByTagName('empty')->item(0); 23 24//要素にテキストコンテンツがない場合はnullを返す 25var_dump($emptyElementNode->textContent); // string(0) "" (PHP8以降は空文字が返る)
PHPのDOMNodeクラスにおけるtextContentプロパティは、ノードのテキストコンテンツを取得または設定するために使用されます。このプロパティは引数を持ちません。DOMDocumentオブジェクトから要素を取得し、その要素のテキストコンテンツを文字列として取得できます。
サンプルコードでは、まずDOMDocumentオブジェクトを作成し、HTML文字列をロードしています。次に、getElementsByTagName()メソッドを使って<p>要素を取得し、item(0)で最初の要素を取得しています。取得した<p>要素のtextContentプロパティにアクセスすることで、その要素に含まれるテキストコンテンツ(この場合は "Hello, world!")を取得し、echoで出力しています。
戻り値は、テキストコンテンツが存在する場合は文字列、存在しない場合はPHP8以降は空文字を返します。サンプルコードでは、createElement()で作成した空の要素に対してtextContentにアクセスした場合の挙動も示しています。この場合、テキストコンテンツがないため、PHP8以降は空文字が返されます。var_dump()関数を使って、textContentプロパティが実際に空文字列を返していることを確認できます。
textContentプロパティは、要素内のすべてのテキストノードを連結したものを返します。要素が子要素を持つ場合、それらの子要素のテキストコンテンツも含まれます。このプロパティは、特定の要素からテキスト情報を抽出する際に非常に便利です。
DOMNode::textContentは、要素ノードのテキストコンテンツを取得するプロパティです。PHP8以降、テキストコンテンツが存在しない場合はnullではなく空文字列""を返すように変更されました。以前のバージョンではnullが返っていたため、バージョンによって動作が異なる点に注意が必要です。また、HTMLドキュメントの構造によっては、意図しないテキストコンテンツを取得する可能性があります。取得対象の要素が正しいか、getElementsByTagNameなどのメソッドで確実に絞り込むようにしましょう。要素が存在しない場合にitem(0)がnullを返す可能性も考慮し、事前に存在チェックを行うとより安全なコードになります。
PHP DOMNode textContent と nodeValue の違いを理解する
1<?php 2 3// DOMDocumentを生成 4$dom = new DOMDocument(); 5 6// HTMLをロード 7$dom->loadHTML('<!DOCTYPE html><html><body><p>Hello, <strong>World!</strong></p></body></html>'); 8 9// p要素を取得 10$p = $dom->getElementsByTagName('p')->item(0); 11 12// textContentプロパティを使用して、p要素のテキストコンテンツを取得 13$textContent = $p->textContent; 14 15// nodeValueプロパティを使用して、p要素のテキストコンテンツを取得 16// こちらはstrong要素の中身も含めたすべてのテキストノードを連結した結果とは異なる場合がある 17// 今回の例では同じ結果になるが、複雑な構造では違いが生じる可能性がある 18$nodeValue = $p->nodeValue; 19 20// 結果を出力 21echo "textContent: " . $textContent . PHP_EOL; 22echo "nodeValue: " . $nodeValue . PHP_EOL; 23 24// textContent は、要素内のすべてのテキストノードを連結した文字列を返す 25// nodeValue は、要素自体がテキストノードの場合にのみ意味を持つ 26// 要素が複数の子ノードを持つ場合、nodeValueはnullまたは最初のテキストノードの値となることが多い
PHPのDOMNodeクラスにおけるtextContentプロパティは、要素内のすべてのテキストコンテンツを文字列として取得するために使用されます。このプロパティは引数を持ちません。戻り値は、テキストコンテンツが存在する場合は文字列型(string)で、存在しない場合はnullを返します。
サンプルコードでは、まずDOMDocumentオブジェクトを作成し、HTMLをロードしています。次に、getElementsByTagNameメソッドを使用してp要素を取得しています。取得したp要素に対してtextContentプロパティを使用し、その結果を変数 $textContent に格納しています。
同様に、nodeValueプロパティを使用してテキストコンテンツを取得し、変数 $nodeValue に格納しています。textContentとnodeValueの違いを理解することが重要です。textContentは要素内のすべてのテキストノードを連結した文字列を返しますが、nodeValueは要素自体がテキストノードである場合に意味を持ちます。要素が複数の子ノードを持つ場合、nodeValueはnullまたは最初のテキストノードの値を返すことがあります。今回の例では、p要素の中にstrong要素が含まれているため、textContentは"Hello, World!"という文字列を返しますが、要素の構造によってはnodeValueと異なる結果になる場合があります。
最後に、取得したtextContentとnodeValueの値を出力し、その違いを確認しています。システムエンジニアを目指す上で、DOMDocumentを扱う際に、textContentプロパティが要素のテキストコンテンツをどのように取得するのかを理解することは非常に重要です。
textContentは要素内のすべてのテキストを連結して取得するのに対し、nodeValueは要素自体がテキストノードの場合に意味を持ちます。今回の例では結果が同じですが、要素内に複数の子要素(特にテキストノード以外の要素)がある場合、nodeValueは期待する結果と異なる可能性があります。textContentは常に要素内のテキスト全体を取得するため、より直感的で安全な選択肢と言えるでしょう。複雑なHTML構造を扱う場合は、特にこの違いに注意が必要です。nodeValueは特定のノードタイプに依存するため、意図しない結果を避けるためにも、textContentの使用を推奨します。