【PHP8.x】textContentプロパティの使い方
textContentプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
textContentプロパティは、Dom\Nodeクラスに属し、ノードとそのすべての子孫ノードのテキストコンテンツを保持するプロパティです。このプロパティを利用することで、HTMLドキュメント内の特定の要素(ノード)に含まれる、すべてのテキスト情報を取得したり、設定したりすることができます。
具体的には、このプロパティを読み込む(取得する)場合、指定したDOMノード(例えば、ウェブページの<div>や<p>要素など)の内部に存在するHTMLタグを完全に無視し、目に見える純粋なテキストだけを一つの文字列として取得します。この際、子ノードや孫ノードのテキストもすべて結合されて含まれるため、階層構造を持つ要素全体のテキスト内容を一度に取得するのに役立ちます。取得されるテキストには、整形のための空白文字や改行などもそのままの形で含まれます。
一方で、このプロパティに新しい文字列を代入して設定する場合、ノードの既存の子ども要素やテキストノードはすべて削除され、代入された文字列が新しいテキストノードとしてそのノードの子どもに設定されます。設定される文字列は、HTMLタグとして解釈されることなく、純粋なテキストとして扱われます。
したがって、ウェブページから要素のテキスト部分だけを簡単に抽出したい時や、プログラムによって要素の表示テキストを安全に更新したい場合に非常に便利な機能です。PHP 8のDom\Nodeクラスで利用できるため、DOM操作を行う際に頻繁に利用されます。ただし、外部からの入力値を直接設定する際は、クロスサイトスクリプティング(XSS)のようなセキュリティリスクに注意し、適切にサニタイズ(無害化)するなどの対策を講じることが重要です。
構文(syntax)
1<?php 2$doc = new DOMDocument(); 3$element = $doc->createElement('p'); 4 5// Dom\Node::textContent プロパティにテキストを設定する 6$element->textContent = 'これはサンプルのテキストです。'; 7 8// Dom\Node::textContent プロパティからテキストを取得して出力する 9echo $element->textContent; 10?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
?string
このプロパティは、ノードに含まれるすべてのテキストコンテンツを文字列として返します。ノードにテキストコンテンツがない場合は null を返します。
サンプルコード
PHP DOMDocumentのtextContentで要素のテキスト内容を取得する
1<?php 2 3// DomDocument を作成 4$dom = new DOMDocument(); 5 6// HTML をロード 7$dom->loadHTML('<!DOCTYPE html><html><body><p>Hello, world!</p></body></html>'); 8 9// p 要素を取得 10$p = $dom->getElementsByTagName('p')->item(0); 11 12// textContent プロパティを使用してテキストコンテンツを取得 13$textContent = $p->textContent; 14 15// 結果を出力 16echo $textContent . PHP_EOL; // Hello, world! 17 18// DomDocument を作成(テキストコンテンツが空の場合) 19$dom_empty = new DOMDocument(); 20$dom_empty->loadHTML('<!DOCTYPE html><html><body><p></p></body></html>'); 21$p_empty = $dom_empty->getElementsByTagName('p')->item(0); 22$textContent_empty = $p_empty->textContent; 23 24// 結果を出力 (null が返る可能性があるため、型チェック) 25if (is_null($textContent_empty)) { 26 echo "テキストコンテンツは null です。" . PHP_EOL; 27} else { 28 echo "テキストコンテンツ: " . $textContent_empty . PHP_EOL; 29}
PHPのDOMNodeクラスにおけるtextContentプロパティは、ノードのテキストコンテンツを取得または設定するために使用します。このプロパティは、PHP 8でnullableなstring型を返すように変更されました。
上記のサンプルコードでは、まずDOMDocumentクラスのインスタンスを作成し、loadHTML()メソッドを使ってHTMLドキュメントを読み込んでいます。次に、getElementsByTagName()メソッドでp要素を取得し、item(0)で最初のp要素にアクセスしています。
$p->textContentとすることで、そのp要素のテキストコンテンツを文字列として取得できます。取得したテキストコンテンツは、echo文で出力されます。この例では、<p>Hello, world!</p>のテキストコンテンツである"Hello, world!"が出力されます。
2つ目の例では、テキストコンテンツが空のp要素に対してtextContentプロパティを使用しています。テキストコンテンツが存在しない場合、textContentはnullを返す可能性があります。そのため、is_null()関数を使ってnullかどうかをチェックし、nullの場合とそうでない場合で異なるメッセージを出力しています。このように、テキストコンテンツが空の場合の戻り値がnullである可能性があることを考慮して処理を行う必要があります。
DOMNode::textContentは、要素ノード内のテキストコンテンツを文字列として取得します。要素内に子ノードがある場合、それらすべてのテキストノードを連結したものが返されます。もしテキストコンテンツが空の場合、PHP 8以降ではnullが返される可能性があります。そのため、is_null()関数などでnullチェックを行い、適切なエラーハンドリングを行うようにしましょう。HTMLドキュメント構造が想定通りであるか確認することも重要です。getElementsByTagName()メソッドで要素を取得する際は、item(0)で最初の要素を取得しているため、要素が存在しない場合にnullが返る可能性も考慮してください。
PHP DOM: textContentとnodeValueの違い
1<?php 2 3declare(strict_types=1); 4 5/** 6 * DOMNodeの textContent と nodeValue プロパティの違いを示します。 7 * 8 * `textContent` は、そのノードとすべての子孫のテキストを連結して返します。 9 * `nodeValue` は、ノード自体の値を返します(要素ノードの場合は null)。 10 */ 11function demonstrateNodeValueVsTextContent(): void 12{ 13 // 検証用のHTML文字列 14 $html = '<p>これは<strong>太字</strong>のテキストです。<!-- コメント --></p>'; 15 16 // DOMDocumentオブジェクトを作成してHTMLを読み込む 17 $dom = new DOMDocument(); 18 $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 19 20 // <p>要素ノード (DOMElement) を取得 21 $pElement = $dom->getElementsByTagName('p')->item(0); 22 23 // --- 要素ノード (Element) での比較 --- 24 echo '--- <p>要素での比較 ---' . PHP_EOL; 25 26 // textContent: 子要素のタグやコメントは無視され、テキストコンテンツのみが連結される 27 // 出力 -> "これは太字のテキストです。" 28 echo 'textContent: ' . $pElement->textContent . PHP_EOL; 29 30 // nodeValue: 要素ノード(DOMElement)の場合、nodeValueは常にnullを返す仕様 31 // 出力 -> NULL 32 echo 'nodeValue: '; 33 var_dump($pElement->nodeValue); 34 35 echo PHP_EOL; 36 37 // --- テキストノード (Text) での比較 --- 38 echo '--- "これは" というテキストノードでの比較 ---' . PHP_EOL; 39 40 // <p>要素の最初の子であるテキストノードを取得 41 $textNode = $pElement->firstChild; 42 43 // テキストノードの場合、textContentとnodeValueは同じ値を返す 44 if ($textNode instanceof DOMText) { 45 // 出力 -> "これは" 46 echo 'textContent: ' . $textNode->textContent . PHP_EOL; 47 // 出力 -> "これは" 48 echo 'nodeValue: ' . $textNode->nodeValue . PHP_EOL; 49 } 50} 51 52// 関数を実行 53demonstrateNodeValueVsTextContent(); 54
PHPのDom\Node::textContentは、HTMLやXML文書の構造を操作する際に、特定のノードとその子孫ノードに含まれるテキストコンテンツをすべて取得するためのプロパティです。このプロパティはDom\Nodeクラスに属し、引数は不要で、結果として文字列または内容がない場合はnullを返します。
textContentの主な役割は、要素内のHTMLタグやコメントなどを完全に無視し、純粋なテキスト部分のみを連結して取得することです。例えば、「<p>これは<strong>太字</strong>のテキストです。</p>」というHTML要素に対しtextContentを使用すると、「これは太字のテキストです。」という結果が得られます。
一方、似た名前のnodeValueプロパティは、ノード自身の値を返します。要素ノード(例: <p>要素)の場合、nodeValueは常にnullを返すという特性があります。しかし、「これは」のような純粋なテキストノードに対しては、textContentもnodeValueも同じく「これは」というテキストを返します。
このように、textContentはノードとそのすべての子孫のテキスト内容をまとめて取得したい場合に非常に便利です。要素の構造を気にせず、表示されているテキストだけを取り出したい場合に活用できます。
textContentとnodeValueは、取得対象のノードの種類によって挙動が異なります。要素ノード(例:<p>)の場合、textContentは子孫要素のテキストを連結した値を返しますが、nodeValueは常にnullを返します。テキストノード(例:"これは")の場合は、textContentとnodeValueは同じテキストの内容を返します。textContentはHTMLタグやコメントを無視してテキストだけを取得したい場合に便利です。nodeValueはノードの種類によって意味が異なるため、意図した値を取得できているか確認が必要です。予期せぬnullが返ってくる場合、ノードの種類を確認しましょう。