【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()を使うのが推奨されます。