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

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

作成日: 更新日:

基本的な使い方

nodeNameプロパティは、Dom\CharacterDataクラスに属するノードの種類を示す名前を保持するプロパティです。PHPのDOM拡張機能では、XMLやHTML文書の各構成要素を「ノード」として扱います。Dom\CharacterDataクラスは、テキスト、コメント、CDATAセクションなど、文字データを直接保持するノードの共通の性質や操作を定義するための抽象クラスです。

このnodeNameプロパティは、当該ノードが具体的にどのような種類の文字データノードであるかを識別するための、一意の文字列を提供します。たとえば、文書内の実際のテキストコンテンツを表すDom\Textノードの場合、このプロパティは常に「#text」という文字列を返します。同様に、XMLやHTMLにおけるコメントを表すDom\Commentノードでは「#comment」を、CDATAセクションを表すDom\CdataSectionノードでは「#cdata-section」という文字列を返します。

このプロパティは読み取り専用であり、ノードが作成される際にその型に応じて自動的に値が設定されるため、プログラムから直接変更することはできません。主に、DOMツリーを走査する際に、現在処理しているノードが特定の種類の文字データノードであるかを確認し、それに応じた処理を実行するために利用されます。ノードの種類を正確に判別するための重要な情報源となります。

構文(syntax)

1<?php
2
3$dom = new DOMDocument();
4$textNode = $dom->createTextNode("サンプルテキスト");
5
6// Dom\CharacterData クラスを継承する DOMText オブジェクトの nodeName プロパティにアクセス
7echo $textNode->nodeName;
8
9?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

このプロパティは、ノードの名前を表す文字列を返します。

サンプルコード

PHP DOM nodeNameでノード名を表示する

1<?php
2
3/**
4 * DOMCharacterDataの具象クラスであるテキストノードとコメントノードの
5 * nodeNameプロパティの値を確認するサンプルコード
6 */
7function displayCharacterDataNodeName(): void
8{
9    // 解析するHTML文字列を準備します。
10    // この文字列には、テキストノードとコメントノードが含まれています。
11    $html = '<p>これはテキストノードです。<!-- これはコメントノードです。 --></p>';
12
13    // DOMDocumentオブジェクトをインスタンス化します。
14    $dom = new DOMDocument();
15
16    // HTML文字列を読み込み、DOMツリーを構築します。
17    // エラーを抑制するために@を使用することがありますが、
18    // 実運用ではlibxml_use_internal_errors()が推奨されます。
19    $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
20
21    // p要素を取得します。
22    $pElement = $dom->getElementsByTagName('p')->item(0);
23
24    // p要素の子ノードをループ処理します。
25    // DOMTextとDOMCommentは、抽象クラスDOMCharacterDataを継承しています。
26    if ($pElement && $pElement->hasChildNodes()) {
27        foreach ($pElement->childNodes as $node) {
28            // ノードの種類(nodeType)と名前(nodeName)を出力します。
29            // テキストノードのnodeNameは "#text" となります。
30            // コメントノードのnodeNameは "#comment" となります。
31            printf(
32                "ノードの種類: %-2d | ノード名 (nodeName): %-10s | 値: %s\n",
33                $node->nodeType,
34                $node->nodeName,
35                trim($node->nodeValue)
36            );
37        }
38    }
39}
40
41// 関数を実行して結果を表示します。
42displayCharacterDataNodeName();
43
44?>

Dom\CharacterDataクラスのnodeNameプロパティは、ノードの名前を文字列として返します。このプロパティは引数を持たず、アクセスすると常にstring型の値が戻り値として得られます。

Dom\CharacterDataは、テキストやコメントといった文字データを扱うノードの共通の機能を提供する抽象クラスです。そのため、DOMText(テキストノード)やDOMComment(コメントノード)のような、このクラスを継承した具体的なクラスのオブジェクトでnodeNameプロパティを利用できます。

サンプルコードでは、まずDOMDocumentオブジェクトを利用してHTML文字列を解析し、DOMツリーを構築しています。次に、<p>タグの中にある子ノードを一つずつ取り出し、それぞれのnodeNameプロパティの値を表示しています。

nodeNameプロパティが返す値は、ノードの種類によって固定されています。サンプルコードの実行結果が示すように、テキストノードの場合は#textという文字列が、コメントノードの場合は#commentという文字列が返されます。このように、nodeNameプロパティはノードの種類を文字列で識別する際に役立ちます。

nodeNameプロパティは、要素ノードではタグ名(例: 'p')を返しますが、テキストノードやコメントノードでは、それぞれ'#text'や'#comment'という固定の文字列を返します。この違いを理解することが重要です。ノードの種類を正確に判定するには、nodeTypeプロパティと併用するのが確実です。また、HTML内の改行やインデントもテキストノードとして扱われることがあるため、意図しない空白ノードが含まれる可能性に注意してください。getElementsByTagNameで要素が取得できない場合、item(0)nullを返すため、処理前にnullチェックを行うことが不可欠です。なお、HTMLの解析エラーを適切に扱うには、エラーを抑制する@ではなく、libxml_use_internal_errors()を使うのが推奨されます。