【PHP8.x】nodeValueプロパティの使い方

nodeValueプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

nodeValueプロパティは、DOMツリー内のノードが持つ値を保持するプロパティです。具体的には、テキストノードの値やコメントノードのコメント内容などを取得・設定するために使用されます。

しかし、Dom\HTMLDocumentクラスのインスタンスが保持するnodeValueプロパティには、特別な振る舞いがあります。Dom\HTMLDocumentオブジェクトは、ウェブページ全体のようなHTMLドキュメント構造そのものを表すノードであり、それ自体が直接的なテキスト値を持つわけではありません。そのため、このnodeValueプロパティにアクセスしても、ほとんどの場合でnullが返されます。

つまり、Dom\HTMLDocumentオブジェクトに対してnodeValueプロパティを参照しても、HTMLドキュメント全体のテキストコンテンツを取得することはできません。また、このプロパティに値を設定しようとしても、ドキュメントの構造が直接変更されることはなく、多くの場合、効果がないか、あるいは意図しない結果となる可能性があります。

HTMLドキュメント内のテキストコンテンツ全体、または特定の要素のテキスト内容を取得したい場合は、通常、Dom\HTMLDocumentオブジェクトから子孫要素をたどり、各テキストノードのnodeValueプロパティを参照するか、より簡潔なtextContentプロパティを使用するのが一般的です。textContentプロパティは、ノードとそのすべての子孫ノードのテキストコンテンツを連結したものを返します。

このプロパティは、ノードの種類によってその意味合いが異なるため、使用する際はどのノードタイプのnodeValueを参照しているのかを意識することが重要です。

構文(syntax)

1<?php
2
3$htmlDocument = new Dom\HTMLDocument();
4$nodeValue = $htmlDocument->nodeValue;
5
6?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string|null

このプロパティは、DOMノードのテキストコンテンツを文字列として返します。ノードにテキストコンテンツがない場合はnullを返します。

サンプルコード

PHP 8 DomDocument nodeValue を取得する

1<?php
2
3/**
4 * Dom\HTMLDocument のノードから nodeValue を取得するサンプル
5 *
6 * システムエンジニアを目指す初心者向けに、PHPのDOM拡張機能(PHP 8以降)を
7 * 使用してHTMLドキュメントを扱い、特定のノードの値(nodeValue)を
8 * 取得する方法を示します。
9 *
10 * nodeValue は、主にテキストノードのテキストコンテンツを取得するために使用されます。
11 * 要素ノード(例: <p>, <div>)の場合、通常は null を返します。
12 */
13function demonstrateDomNodeValue(): void
14{
15    // Dom\HTMLDocument クラスのインスタンスを作成します。
16    // これはPHP 8以降で推奨される新しいDOM APIです。
17    $document = new Dom\HTMLDocument();
18
19    // シンプルなHTMLコンテンツをロードします。
20    // loadHTML() メソッドは、指定されたHTML文字列をパースし、DOMツリーを構築します。
21    $htmlContent = '<!DOCTYPE html><html><body><p>これはサンプルのテキストです。</p></body></html>';
22    $document->loadHTML($htmlContent);
23
24    // <p>要素をDOMツリーから取得します。
25    // getElementsByTagName('p') は、すべての <p> 要素を含む Dom\HTMLCollection を返します。
26    // item(0) でコレクション内の最初の <p> 要素にアクセスします。
27    $paragraphElement = $document->getElementsByTagName('p')->item(0);
28
29    // <p>要素が存在するか確認します。
30    if ($paragraphElement) {
31        echo "--- テキストノードの nodeValue の取得例 ---\n";
32
33        // <p>要素の最初の子ノードを取得します。
34        // この場合、"これはサンプルのテキストです。" というテキストを含む Dom\Text ノードです。
35        $textNode = $paragraphElement->firstChild;
36
37        // 子ノードが Dom\Text のインスタンスであるか確認します。
38        if ($textNode instanceof Dom\Text) {
39            // Dom\Text ノードの nodeValue は、そのノードが保持するテキストコンテンツを返します。
40            echo "テキストノードの nodeValue: " . $textNode->nodeValue . "\n";
41        } else {
42            echo "エラー: <p>要素の最初の子ノードがテキストノードではありません。\n";
43        }
44
45        echo "\n--- 参考: 要素ノードの nodeValue ---\n";
46        // 要素ノード(Dom\Element)自体の nodeValue は通常 null を返します。
47        // var_export を使用して null が文字列として出力されるようにしています。
48        echo "P要素 (Dom\Element) の nodeValue: " . var_export($paragraphElement->nodeValue, true) . "\n";
49    } else {
50        echo "エラー: HTMLドキュメント内に <p> 要素が見つかりませんでした。\n";
51    }
52}
53
54// 上記で定義した関数を実行して、サンプルコードの動作を確認します。
55demonstrateDomNodeValue();
56
57?>

このPHPサンプルコードは、PHP 8から導入された新しいDOM拡張機能を用いて、HTMLドキュメント内のノードからnodeValueプロパティを利用する方法を説明します。nodeValueは、DOMツリーを構成する各ノードが持つプロパティの一つです。主にテキストノード(例えば、<p>テキスト</p>における「テキスト」の部分)のコンテンツを文字列として取得するために使用されます。

サンプルでは、まずDom\HTMLDocumentクラスのインスタンスを作成し、HTMLコンテンツを読み込みます。次に、<p>要素を取得し、その子ノードであるテキストノードnodeValueにアクセスして、ノードが持つテキスト「これはサンプルのテキストです。」を正確に取得できることを示しています。

一方、<p>要素のような要素ノード自体nodeValueは、通常nullを返します。このプロパティには引数がなく、戻り値は、ノードがテキストコンテンツを持つ場合はstring型、そうでない場合はnullです。この挙動を理解することで、HTMLドキュメントから必要なテキスト情報を効率的に抽出できるようになります。

nodeValueプロパティは、主にテキストノードからテキストコンテンツを取得するために利用されます。要素ノード(例: <p>タグ)のnodeValueは、通常nullを返しますので、要素内のテキスト内容を得たい場合は、その要素の子であるテキストノードからnodeValueを取得するように注意してください。ノードが存在しない場合や、nodeValuenullを返す可能性があるため、取得した値に対しては常にnullチェックを行うことが安全なコードを書く上で重要です。サンプルコードのように、対象のノードがDom\Textのような期待するタイプであるかを確認する習慣も推奨されます。

PHP Dom\HTMLDocument の nodeValue を確認する

1<?php
2
3/**
4 * Dom\HTMLDocument クラスの nodeValue プロパティの使用例。
5 *
6 * Dom\HTMLDocument はドキュメントノードを表すクラスで、Dom\Node クラスを継承しています。
7 * nodeValue プロパティは Dom\Node クラスから継承されますが、
8 * ドキュメントノード自体は直接テキストコンテンツを持たないため、
9 * Dom\HTMLDocument インスタンスの nodeValue は常に null を返します。
10 *
11 * nodeValue は主にテキストノード (Dom\Text) など、
12 * そのノード自体がテキストデータを保持する場合に有用です。
13 */
14function demonstrateHtmlDocumentNodeValue(): void
15{
16    // Dom\HTMLDocument のインスタンスを作成
17    $document = new Dom\HTMLDocument();
18
19    // 簡単なHTML文字列をロード
20    // ドキュメント構造が構築されますが、ドキュメントノード自体にテキストコンテンツはありません。
21    $htmlString = '<!DOCTYPE html><html><head><title>My Page</title></head><body><h1>Hello World!</h1></body></html>';
22    $document->loadHTML($htmlString);
23
24    // Dom\HTMLDocument インスタンスの nodeValue プロパティにアクセス
25    // 結果は null となります。
26    $nodeValueResult = $document->nodeValue;
27
28    echo "Dom\\HTMLDocument インスタンスの nodeValue: ";
29    var_export($nodeValueResult); // null を出力します
30    echo "\n";
31}
32
33// 関数を実行します
34demonstrateHtmlDocumentNodeValue();

PHPのDom\HTMLDocumentクラスにおけるnodeValueプロパティは、HTMLドキュメント内のノードが持つテキストコンテンツを取得するために使用されます。このプロパティは、全てのDOMノードの基本クラスであるDom\Nodeから継承されており、アクセスする際に引数は不要です。

しかし、Dom\HTMLDocumentはウェブページ全体の構造、つまりドキュメントノードそのものを表します。ドキュメントノード自体は、HTMLファイル全体のように、直接テキストコンテンツを持つわけではありません。テキストコンテンツは、<p>テキスト</p>のような特定の要素やテキストノードの内部に存在します。

そのため、Dom\HTMLDocumentのインスタンスに対してnodeValueプロパティにアクセスした場合、戻り値としては常にnullが返されます。サンプルコードでは、new Dom\HTMLDocument()で新しいドキュメントを作成し、loadHTML()メソッドでHTML文字列を読み込んだ後も、$document->nodeValueにアクセスするとnullとなることを示しています。

nodeValueプロパティが実際にテキストデータを返すのは、主にDom\Textのようなテキストノードや、特定の要素が持つテキストコンテンツなど、ノード自体が直接テキストを保持する場合です。ドキュメントノードでは常にnullを返すという挙動を理解しておくことが重要です。

このサンプルコードでは、Dom\HTMLDocumentクラスのnodeValueプロパティが常にnullを返す点にご注意ください。Dom\HTMLDocumentはHTMLドキュメント全体を表すノードであり、そのノード自体には直接テキストコンテンツが含まれないためです。nodeValueは、主にDom\Textのような、ノード自身がテキストデータを保持する場合に利用します。HTMLドキュメント内の具体的なコンテンツ(要素のテキストや属性値など)にアクセスしたい場合は、getElementsByTagNamechildNodesなどのメソッドを使って、目的の要素ノードやテキストノードを取得し、それらのノードのプロパティを参照するようにしてください。Dom\HTMLDocumentnodeValuenullを返すのは仕様上の正しい動作であり、エラーではありませんのでご安心ください。

【PHP8.x】nodeValueプロパティの使い方 | いっしー@Webエンジニア