【PHP8.x】Dom\Node::nodeValueプロパティの使い方
nodeValueプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
nodeValueプロパティは、DOMツリー内の各ノードが保持する値を文字列として取得および設定するためのプロパティです。これはPHPのDom\Nodeクラスに属し、XMLやHTMLドキュメントの構造を表すDOM(Document Object Model)を操作する際に利用されます。
このプロパティが返す値や設定時の挙動は、ノードの種類によって異なります。例えば、テキストノード、コメントノード、CDATAセクションノード、属性ノードの場合、nodeValueはそれらが持つ実際のコンテンツ(テキスト内容、コメント内容、属性値など)を文字列として返します。
一方で、要素ノードやドキュメントノードのように、それ自体が直接テキスト内容を持たないノードの場合、通常はNULLを返します。ただし、PHPのDOM拡張では、要素ノードの子孫ノードのテキストコンテンツを結合した文字列を返すことがあります。この挙動は、他のDOM実装と異なる場合があるため、注意が必要です。
nodeValueプロパティに新しい値を設定することで、ノードの値を変更できます。例えば、テキストノードやコメントノードのコンテンツを更新可能です。特に注意が必要なのは、要素ノードに対してnodeValueを設定した場合です。この操作を行うと、その要素ノードが持つ既存の子ノードはすべて削除され、設定された値を持つ新しいテキストノードがその要素の子として追加されます。これにより、既存のコンテンツが意図せず上書きされる可能性があるため、要素ノードのテキスト内容を操作する際は、この挙動を理解した上で慎重に利用することが求められます。
nodeValueプロパティは、DOM操作においてノードのコンテンツを直接扱う基本的な手段ですが、ノードタイプによる挙動の違いと、値を設定する際の影響を理解することが重要です。
構文(syntax)
1<?php 2// DOMDocumentオブジェクトとテキストノードを作成します 3$dom = new DOMDocument(); 4$textNode = $dom->createTextNode('Initial Value'); 5 6// nodeValueプロパティを使ってノードの値を取得します 7$currentValue = $textNode->nodeValue; 8echo $currentValue . PHP_EOL; // "Initial Value" を出力 9 10// nodeValueプロパティを使ってノードの値を設定します 11$textNode->nodeValue = 'Updated Value'; 12echo $textNode->nodeValue . PHP_EOL; // "Updated Value" を出力 13?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
?string
Dom\Nodeオブジェクトのノードの値(テキストコンテンツなど)を文字列で返します。ノードに値がない場合はnullを返します。
サンプルコード
PHP DOMDocument nodeValueを取得する
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$element = $dom->getElementsByTagName('p')->item(0); 11 12// nodeValue を取得して表示 13if ($element) { 14 $nodeValue = $element->nodeValue; 15 16 if ($nodeValue !== null) { 17 echo "p要素のnodeValue: " . $nodeValue . PHP_EOL; 18 } else { 19 echo "p要素のnodeValueはnullです。" . PHP_EOL; 20 } 21} else { 22 echo "p要素が見つかりませんでした。" . PHP_EOL; 23} 24 25?>
このサンプルコードは、PHPのDOMDocumentクラスを使用して、HTMLドキュメントから特定の要素のテキストコンテンツ(nodeValue)を取得する方法を示しています。
まず、DOMDocumentクラスのインスタンスを作成し、loadHTML()メソッドを使ってHTML文字列を読み込みます。次に、getElementsByTagName('p')で<p>要素のリストを取得し、item(0)で最初の<p>要素を取得しています。
nodeValueプロパティは、DOMNodeインターフェースから継承されたプロパティで、要素のテキストコンテンツを表す文字列を返します。このサンプルでは、取得した<p>要素のnodeValueを$element->nodeValueで取得し、変数$nodeValueに格納しています。
nodeValueプロパティの戻り値は?string型であり、文字列またはnullとなる可能性があります。そのため、if ($nodeValue !== null)でnullチェックを行い、nullでない場合にのみ、echo文でテキストコンテンツを表示しています。nullの場合は、"p要素のnodeValueはnullです。"というメッセージを表示します。
もし<p>要素が見つからなかった場合($elementがnullの場合)は、"p要素が見つかりませんでした。"というメッセージが表示されます。
このコードを実行すると、HTML内の<p>要素のテキストコンテンツである "Hello, World!" がターミナルに出力されます。 nodeValueプロパティを使用することで、HTMLドキュメントから簡単にテキスト情報を抽出できます。
DOMNode::nodeValueは、要素ノードの内容(テキスト)を取得する際に使用します。
loadHTMLでHTMLを読み込む場合、文字エンコーディングに注意が必要です。UTF-8以外のエンコーディングの場合、文字化けが発生する可能性があります。
getElementsByTagNameは、DOMNodeListオブジェクトを返します。item(0)で最初の要素を取得していますが、要素が存在しない場合はnullを返すため、必ず存在チェックを行いましょう。
nodeValueは?string型を返すため、nullの可能性を考慮して、!== nullで厳密な比較を行うことを推奨します。
nodeValueは要素ノードの内容全体を返します。特定の部分だけを取得したい場合は、文字列操作が必要になります。
PHPのnodeValueでHTMLテキストを取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * HTML文字列を解析し、nodeValueプロパティの挙動を示すサンプル 7 * 8 * nodeValueはノードの種類によって返す値が異なります。 9 * - 要素ノード (DOMElement): 常に null 10 * - テキストノード (DOMText): テキストの内容 11 * この違いを理解することが重要です。 12 */ 13function demonstrateNodeValue(): void 14{ 15 // 解析対象のHTML文字列 16 $html = <<<HTML 17 <!DOCTYPE html> 18 <html lang="ja"> 19 <head> 20 <title>サンプル</title> 21 </head> 22 <body> 23 <h1>タイトル</h1> 24 <p>これはサンプルテキストです。</p> 25 </body> 26 </html> 27 HTML; 28 29 // DOMDocumentオブジェクトをインスタンス化 30 $dom = new DOMDocument(); 31 32 // HTMLを読み込む (HTML5のタグによる警告を抑制) 33 libxml_use_internal_errors(true); 34 $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 35 libxml_clear_errors(); 36 37 // getElementsByTagNameでp要素を取得 38 // 戻り値はDOMNodeListオブジェクト 39 $pElement = $dom->getElementsByTagName('p')->item(0); 40 41 if ($pElement instanceof \DOMElement) { 42 // 1. 要素ノード (<p>) の場合 43 // 要素ノード自体の nodeValue は常に null です。 44 // 要素内のテキスト全体を取得したい場合は、代わりに textContent プロパティを使用します。 45 echo '--- p要素ノード (DOMElement) ---' . PHP_EOL; 46 echo 'textContent: ' . $pElement->textContent . PHP_EOL; 47 echo 'nodeValue: '; 48 var_dump($pElement->nodeValue); // 出力: NULL 49 echo PHP_EOL; 50 51 // 2. テキストノードの場合 52 // p要素の最初の子ノード (この場合はテキストノード) を取得します。 53 $textNode = $pElement->firstChild; 54 if ($textNode instanceof \DOMText) { 55 // テキストノードの nodeValue は、ノードが持つテキスト文字列そのものです。 56 echo '--- p要素内のテキストノード (DOMText) ---' . PHP_EOL; 57 echo 'nodeValue: ' . $textNode->nodeValue . PHP_EOL; 58 } 59 } 60} 61 62// 関数を実行 63demonstrateNodeValue();
PHP 8のDom\Node::nodeValueプロパティは、HTMLやXML文書の構造を扱う際に、各ノードの値を参照するために使用されます。このプロパティは引数を取らず、戻り値は文字列またはnullとなります。
このnodeValueプロパティの重要な特徴は、ノードの種類によって返される値が異なる点です。例えば、<p>や<h1>のような要素ノード(DOMElementオブジェクト)の場合、nodeValueは常にnullを返します。これは、要素自体が直接的な値を持たないためです。サンプルコードでは<p>要素のnodeValueがnullになることを示しています。
一方、要素内の純粋なテキスト部分を表すテキストノード(DOMTextオブジェクト)の場合、nodeValueはそのテキストノードが保持する実際の文字列内容を返します。サンプルコードでは、<p>これはサンプルテキストです。</p>の中の「これはサンプルテキストです。」というテキストノードのnodeValueがこの文字列になることを確認できます。
したがって、特定の要素に含まれる全てのテキスト内容をまとめて取得したい場合は、nodeValueではなく、textContentプロパティを使用するのが一般的です。textContentは、そのノードとその子孫ノード全てのテキストコンテンツを連結したものを返します。
nodeValueプロパティは、ノードの種類によって挙動が異なります。要素ノード(DOMElement)の場合、nodeValueは常にnullを返します。要素ノード内のテキストを取得したい場合は、textContentプロパティを使用してください。テキストノード(DOMText)の場合、nodeValueはテキストの内容を返します。getElementsByTagNameなどで取得した要素からテキストを取得する際は、ノードの種類を確認し、適切なプロパティを使用するように注意してください。HTMLを読み込む際には、エラー処理としてlibxml_use_internal_errors(true)とlibxml_clear_errors()を使用することを推奨します。