【PHP8.x】Dom\ProcessingInstruction::textContentプロパティの使い方
textContentプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『textContentプロパティは、処理命令ノード(Dom\ProcessingInstruction)のテキスト内容を保持するプロパティです。XMLやHTMLにおける処理命令とは、<?target data?>という形式で記述され、文書を処理するアプリケーションに特定の指示を与えるものです。このtextContentプロパティは、処理命令のtarget部分を除いたdata部分の文字列を取得、または設定するために使用されます。例えば、<?xml-stylesheet href="style.css"?>という処理命令ノードがある場合、このノードのtextContentプロパティには" href="style.css""という文字列が格納されています。この値は、同じくDom\ProcessingInstructionクラスが持つdataプロパティの値と常に同じ内容となります。また、このプロパティは読み取りだけでなく、新しい文字列を代入することで処理命令のデータ部分を書き換えることも可能です。DOMNodeクラスから継承された汎用的なプロパティですが、子ノードを持たない処理命令ノードにおいては、そのデータ部を直接操作するための便利なインターフェースとして機能します。
構文(syntax)
1<?php 2// DOMDocumentオブジェクトを作成します 3$doc = new Dom\Document(); 4 5// 処理命令ノードを作成します (ターゲット: 'php', データ: 'echo "Hello";') 6$pi = $doc->createProcessingInstruction('php', 'echo "Hello";'); 7 8// textContentプロパティで処理命令のデータを取得して表示します 9// 出力: echo "Hello"; 10echo $pi->textContent . PHP_EOL; 11 12// textContentプロパティに新しいデータを設定します 13$pi->textContent = 'phpinfo();'; 14 15// 変更後のtextContentプロパティのデータを取得して表示します 16// 出力: phpinfo(); 17echo $pi->textContent . PHP_EOL;
引数(parameters)
引数なし
引数はありません
戻り値(return)
?string
このプロパティは、ProcessingInstructionノードのテキストコンテンツを文字列として返します。ノードにテキストコンテンツがない場合はnullを返します。
サンプルコード
PHP DOM textContent で処理命令を取得する
1<?php 2 3/** 4 * DOMProcessingInstructionのtextContentプロパティを使用して、 5 * XML処理命令のデータを取得するサンプル関数 6 * 7 * @return void 8 */ 9function getProcessingInstructionTextContent(): void 10{ 11 // 処理命令 (<?xml-stylesheet ... ?>) を含むXML文字列を定義 12 $xmlString = <<<XML 13 <?xml version="1.0" encoding="UTF-8"?> 14 <?xml-stylesheet type="text/css" href="style.css"?> 15 <root> 16 <item>This is a sample item.</item> 17 </root> 18 XML; 19 20 // DOMDocumentオブジェクトを生成 21 $doc = new DOMDocument(); 22 23 // XML文字列を読み込む 24 $doc->loadXML($xmlString); 25 26 // ドキュメント直下の子ノードをループして処理命令を探す 27 foreach ($doc->childNodes as $node) { 28 // ノードが処理命令 (DOMProcessingInstruction) かどうかを判定 29 if ($node instanceof DOMProcessingInstruction) { 30 // $textContent プロパティは、処理命令のデータ部分の文字列を返す 31 // この例では 'type="text/css" href="style.css"' が取得される 32 // これは $node->data プロパティと同じ値 33 $textContent = $node->textContent; 34 35 echo "処理命令のターゲット: " . $node->target . PHP_EOL; // "xml-stylesheet" 36 echo "textContentプロパティの値: " . $textContent . PHP_EOL; 37 break; // 最初の処理命令を見つけたらループを終了 38 } 39 } 40} 41 42// 関数を実行 43getProcessingInstructionTextContent(); 44 45?>
このPHPサンプルコードは、XML文書に含まれる処理命令(Processing Instruction)のデータを取得する方法を示しています。ここではDOMProcessingInstructionクラスが持つtextContentプロパティを使用します。
コードの流れとして、まずDOMDocumentオブジェクトを生成し、loadXML()メソッドを使って<?xml-stylesheet ... ?>という処理命令を含むXML文字列を解析します。これにより、プログラムがXMLの構造を扱えるようになります。
次に、foreachループでXML文書内のノードを一つずつ調べ、instanceof DOMProcessingInstructionを用いて、そのノードが処理命令であるかを判定します。
目的の処理命令ノードが見つかったら、$node->textContentのようにtextContentプロパティにアクセスします。このプロパティは、処理命令のターゲット(この例ではxml-stylesheet)の後に続くデータ部分を文字列として返します。サンプルコードでは、type="text/css" href="style.css"という文字列が取得されます。このプロパティは引数を取らず、戻り値は文字列(string)、またはデータが存在しない場合はnullとなります。
このようにtextContentプロパティを利用することで、XML処理命令の具体的な内容を簡単に取り出すことが可能です。
Dom\ProcessingInstructionのtextContentプロパティは、XMLの処理命令(<?...?>)から、ターゲット(最初の単語)を除いたデータ部分の文字列を取得するために使用します。例えば<?xml-stylesheet type="text/css"?>という処理命令では、type="text/css"の部分が返されます。ターゲットであるxml-stylesheetはtargetプロパティで取得できるため、これらを使い分けることで処理命令を正確に分解できます。なお、このクラスではtextContentプロパティとdataプロパティは同じ値を返します。また、loadXML()でXMLを読み込む際は、不正な形式だと失敗することがあるため、戻り値を確認するエラー処理を記述するようにしてください。
PHP DOM: nodeValueとtextContentの違い
1<?php 2 3/** 4 * DOMNode の nodeValue と textContent プロパティの違いを比較する. 5 * 6 * `textContent` は、ノードとその子孫のテキストコンテンツを連結して返します。 7 * 一方、`nodeValue` の挙動はノードの種類によって異なります。 8 * 9 * - 要素ノード (`DOMElement`): 10 * - `nodeValue` は常に `null` です。 11 * - `textContent` は子孫を含む全てのテキストを返します。 12 * - 処理命令ノード (`DOMProcessingInstruction`) やコメントノード (`DOMComment`): 13 * - `nodeValue` と `textContent` は同じ内容を返します。 14 */ 15function compareNodeValueAndTextContent(): void 16{ 17 // 比較用のXML文字列を定義 18 $xmlString = <<<XML 19<?xml version="1.0" encoding="UTF-8"?> 20<?php-style process-this-content?> 21<root> 22 <!-- This is a comment --> 23 <element> 24 Hello <strong>World</strong>! 25 </element> 26</root> 27XML; 28 29 // DOMDocumentオブジェクトを作成し、XMLを読み込む 30 $dom = new DOMDocument(); 31 $dom->loadXML($xmlString); 32 33 // XPathを使って各ノードを取得 34 $xpath = new DOMXPath($dom); 35 $piNode = $xpath->query('/processing-instruction("php-style")')->item(0); 36 $elementNode = $xpath->query('//element')->item(0); 37 38 // --- 1. 処理命令ノード (DOMProcessingInstruction) の比較 --- 39 echo '■ DOMProcessingInstruction' . PHP_EOL; 40 // `nodeValue` は処理命令の内容を返す 41 echo 'nodeValue: '; 42 var_dump($piNode->nodeValue); 43 // `textContent` も `nodeValue` と同じ内容を返す 44 echo 'textContent: '; 45 var_dump($piNode->textContent); 46 echo PHP_EOL; 47 48 // --- 2. 要素ノード (DOMElement) の比較 --- 49 echo '■ DOMElement' . PHP_EOL; 50 // 要素ノードの `nodeValue` は常に null 51 echo 'nodeValue: '; 52 var_dump($elementNode->nodeValue); 53 // `textContent` は子ノードのテキストを再帰的に連結して返す (タグは除去される) 54 echo 'textContent: '; 55 var_dump($elementNode->textContent); 56 echo PHP_EOL; 57} 58 59// 関数を実行 60compareNodeValueAndTextContent();
このPHPコードは、XML文書を扱うDOM拡張機能において、nodeValueプロパティとtextContentプロパティの挙動の違いを比較するサンプルです。ノードの種類によって、これらのプロパティが返す値がどのように異なるかを具体的に示しています。
Dom\ProcessingInstruction(処理命令ノード)のtextContentプロパティは、引数なしでアクセスでき、そのノードが持つ内容を文字列として返します。サンプルコードにある処理命令ノード <?php-style process-this-content?> の場合、textContentとnodeValueは全く同じ挙動を示し、どちらも内容部分である文字列 'process-this-content' を返します。
一方、<element>のような要素ノードでは挙動が大きく異なります。要素ノードのnodeValueは仕様上、常にnullを返します。それに対してtextContentは、その要素が持つ子や孫のノードに含まれるテキストをすべて連結した一つの文字列を返します。そのため、サンプルではHTMLタグである<strong>は無視され、'Hello World!'という純粋なテキストが取得されます。
このように、ノードの種類によってnodeValueとtextContentを使い分ける必要があります。要素が持つテキスト全体をタグを除いて取得したい場合にはtextContentが非常に便利です。
nodeValueとtextContentは似ていますが、ノードの種類によって挙動が大きく異なるため注意が必要です。特に、サンプルコードの<element>のような要素ノードに対してnodeValueを使用すると、常にnullが返ってきます。要素が持つテキストを子孫まで含めて全て取得したい場合は、textContentを使いましょう。textContentは、HTMLタグなどを全て取り除き、人間が読むテキスト部分だけを連結して返します。一方、処理命令やコメントのようなノードでは、nodeValueとtextContentは同じ値を返します。取得したい情報に応じて、これらのプロパティを正しく使い分けることが重要です。