【PHP8.x】DOMEntity::textContentプロパティの使い方
textContentプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
textContentプロパティは、DOMツリー内のエンティティノード(DOMEntity)が持つテキストコンテンツを保持するプロパティです。DOMEntityクラスは、XMLドキュメントのDTD(Document Type Definition)や内部サブセットで定義されるエンティティを表します。例えば、XMLの<!ENTITY product "製品A">のような宣言がある場合、このproductがDOMEntityとして扱われます。このtextContentプロパティは、そのエンティティが実際に置き換わるテキスト値、上記の例では「製品A」のような内容を保持します。
このプロパティを利用することで、定義されたエンティティの具体的なテキスト内容をプログラムから取得したり、設定したりすることができます。例えば、エンティティが外部ファイルを参照している場合でも、そのエンティティの解決後のテキストコンテンツにアクセスすることが可能です。システムエンジニアを目指す初心者の方にとっては、XMLドキュメントの構造を理解し、その中からエンティティとして定義された特定の内容を効率的に抽出したり、動的に変更したりする際に非常に有用な機能となります。XMLドキュメントをPHPでパースして操作する場面で、エンティティの値を直接扱いたい場合に活用できます。このプロパティに新しいテキストを設定すると、既存のテキストコンテンツが指定した値で置き換えられます。
構文(syntax)
1<?php 2$dom = new DOMDocument(); 3$xmlString = '<!DOCTYPE doc [<!ENTITY myentity "My Entity Content.">]><doc/>'; 4$dom->loadXML($xmlString); 5 6$doctype = $dom->doctype; 7$entities = $doctype->entities; 8 9$entity = $entities->getNamedItem('myentity'); 10 11$content = $entity->textContent;
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
DOMEntity要素とその子孫要素のテキストコンテンツを連結した文字列を返します。
サンプルコード
PHP DOM: textContentで要素のテキストを取得・設定する
1<?php 2 3/** 4 * DOMNodeのtextContentプロパティを使用して、要素のテキスト内容を取得・設定するサンプル関数 5 * 6 * DOMDocumentを使ってHTMLを解析し、特定の要素のテキスト内容を操作します。 7 * textContentプロパティは、HTMLタグを除いた純粋なテキストのみを扱います。 8 */ 9function demonstrateDomTextContent(): void 10{ 11 // 操作対象のHTML文字列を定義 12 $html = <<<HTML 13 <!DOCTYPE html> 14 <html> 15 <head> 16 <title>サンプルページ</title> 17 </head> 18 <body> 19 <div id="main"> 20 <p>これは <b>太字</b> を含む最初の段落です。</p> 21 </div> 22 </body> 23 </html> 24 HTML; 25 26 // DOMDocumentオブジェクトを生成 27 $dom = new DOMDocument(); 28 29 // HTML5の警告を抑制し、HTML文字列を安全に読み込む 30 // @ は意図的にエラーを抑制するためのものです 31 @$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 32 33 // pタグの要素を取得 (DOMNodeListオブジェクトが返る) 34 $paragraphs = $dom->getElementsByTagName('p'); 35 36 // 最初のp要素を取得 (DOMElementはDOMNodeの子クラス) 37 $firstParagraph = $paragraphs->item(0); 38 39 if ($firstParagraph) { 40 // --- textContentの取得 --- 41 // textContentプロパティで、子要素のタグを除いたテキスト内容を取得 42 echo "元のテキスト内容: " . $firstParagraph->textContent . PHP_EOL; 43 // 出力: 元のテキスト内容: これは 太字 を含む最初の段落です。 44 45 echo "--------------------" . PHP_EOL; 46 47 // --- textContentの設定 --- 48 // textContentプロパティに新しい値を設定すると、既存の子要素はすべて削除される 49 $firstParagraph->textContent = '新しいテキストに置き換えました。'; 50 51 // 変更後のHTML全体を出力して確認 52 echo "変更後のHTML:" . PHP_EOL; 53 echo $dom->saveHTML(); 54 // 出力: 55 // 変更後のHTML: 56 // <html><head> 57 // <title>サンプルページ</title> 58 // </head> 59 // <body> 60 // <div id="main"> 61 // <p>新しいテキストに置き換えました。</p> 62 // </div> 63 // </body></html> 64 } 65} 66 67// 関数を実行 68demonstrateDomTextContent();
PHPのtextContentは、DOM要素とそのすべての子要素に含まれるテキスト内容を取得したり、新しく設定したりするためのプロパティです。HTMLの構造を意識せず、画面に表示されるような純粋なテキスト情報だけを簡単に扱いたい場合に非常に便利です。
サンプルコードでのテキスト取得部分では、<p>要素のtextContentプロパティを参照しています。このとき、子要素である<b>タグは無視され、その中のテキストを含めてすべてが連結された一つの文字列として返されます。このように、textContentはHTMLタグを取り除いたテキストデータのみを取得する特性があります。
次に、このプロパティに新しい文字列を設定しています。textContentに値を代入すると、その要素が元々持っていた子要素(この例ではテキストや<b>タグ)はすべて完全に削除され、指定した新しい文字列を持つテキストノードが一つだけ作成されます。これにより、要素の内容をシンプルに書き換えることができます。
このtextContentはプロパティであるため、メソッドのような引数はありません。値を取得する際の戻り値は、テキスト内容を表す文字列(string型)です。
textContentプロパティは、HTMLタグを除いた純粋なテキストのみを取得・設定する機能です。値を取得する際、サンプルコードの<b>タグが結果に含まれないように、要素内のタグはすべて無視され、テキスト部分だけが連結されて返されます。最も重要な注意点は、このプロパティに新しいテキストを設定すると、元々あった子要素(他のタグやテキスト)がすべて削除され、指定した文字列に完全に置き換わる点です。HTML構造を維持したまま一部のテキストだけを編集したい場合には適していません。また、日本語を扱う際はloadHTMLの前に文字エンコーディングを指定しないと、文字化けの原因となるため注意してください。
PHP DOM: nodeValue vs textContentを比較する
1<?php 2 3/** 4 * nodeValueとtextContentプロパティの違いを比較して表示します。 5 * 6 * この関数は、同じHTML構造に対して、要素ノードとテキストノードにおける 7 * `nodeValue`と`textContent`の挙動の違いを具体的に示します。 8 */ 9function compareNodeValueAndTextContent(): void 10{ 11 // 比較対象となるシンプルなHTML文字列 12 $html = '<p>これは <strong>重要</strong> なテキストです。</p>'; 13 14 // DOMDocumentオブジェクトを生成し、HTMLを読み込む 15 $dom = new DOMDocument(); 16 // HTML5としてパースするためにエラー出力を抑制 17 libxml_use_internal_errors(true); 18 $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 19 libxml_clear_errors(); 20 21 // <p>要素ノードを取得 22 $pElement = $dom->getElementsByTagName('p')->item(0); 23 24 // --- 1. 要素ノード (<p>) での比較 --- 25 echo '--- 1. 要素ノード (<p>) での比較 ---' . PHP_EOL; 26 27 // textContent は、そのノードとすべての子孫ノードに含まれるテキストを連結して返す 28 // -> "これは " + "重要" + " なテキストです。" が連結される 29 echo 'textContent: ' . $pElement->textContent . PHP_EOL; 30 31 // nodeValue は、要素ノードの場合は常に null を返す 32 echo 'nodeValue: ' . var_export($pElement->nodeValue, true) . PHP_EOL; 33 34 echo PHP_EOL; 35 36 // --- 2. テキストノード ("これは ") での比較 --- 37 // <p>要素の最初の子ノード(テキストノード "これは ")を取得 38 $firstTextNode = $pElement->childNodes->item(0); 39 echo '--- 2. テキストノード (\'これは \') での比較 ---' . PHP_EOL; 40 41 // textContent は、テキストノードの場合、自身のテキスト内容を返す (nodeValue と同じ) 42 echo 'textContent: ' . $firstTextNode->textContent . PHP_EOL; 43 44 // nodeValue は、テキストノード自身のテキスト内容を返す 45 echo 'nodeValue: ' . $firstTextNode->nodeValue . PHP_EOL; 46} 47 48// 関数を実行して結果を表示 49compareNodeValueAndTextContent();
PHPのtextContentプロパティは、あるHTML要素(ノード)とその内部に含まれるすべての子要素(子孫ノード)のテキスト内容を連結し、一つの文字列として取得する機能を提供します。このプロパティは引数を取らず、戻り値は常に文字列です。HTMLタグ自体は無視され、画面に表示されるテキスト部分だけが抽出されます。
このサンプルコードは、textContentと似た働きを持つnodeValueプロパティとの挙動の違いを明確に示しています。まず、<p>という「要素ノード」で比較します。textContentは、<p>タグの中にあるすべてのテキストを、<strong>タグの中身も含めて連結し、「これは 重要 なテキストです。」という文字列を返します。一方、nodeValueは要素ノードに対して使用すると、仕様上必ずnull(値がないことを示す特別な値)を返します。
次に、「これは 」という文章の一部である「テキストノード」で比較します。この場合、textContentとnodeValueはどちらもそのノードが持つテキストそのものを返すため、「これは 」という同じ結果になります。このように、textContentは要素全体のテキストをまとめて取得したい場合に便利であり、nodeValueはテキストノード単体の値を取得する場合などに使われる、という使い分けがあります。
textContentとnodeValueの最も重要な違いは、対象とするノードの種類によって挙動が大きく異なる点です。textContentプロパティは、要素ノード(例: <p>タグ)に対して使用すると、その内部に含まれる全ての子孫ノードのテキストを連結して返します。HTMLタグは無視されるため、画面に見えるテキスト全体を取得したい場合に便利です。一方、nodeValueは要素ノードに対して使用すると常にnullを返します。これは初心者が間違いやすいポイントです。nodeValueで値を取得できるのは、サンプルコードの後半にあるようなテキストノードやコメントノードなどに限られます。DOMを操作する際は、今扱っているノードが要素なのかテキストなのかを意識することが、意図した値を正しく取得するための鍵となります。