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

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

作成日: 更新日:

基本的な使い方

nextSiblingプロパティは、Dom\CharacterData オブジェクトの次の兄弟ノードを保持するプロパティです。具体的には、現在のノードと同じ親ノードを持ち、かつドキュメントツリー上で現在のノードの直後に位置するノードへの参照を返します。もし次の兄弟ノードが存在しない場合は、null を返します。

このプロパティは読み取り専用であり、値を変更することはできません。主にドキュメントの構造を解析し、特定のノードから順番に要素を辿る際に利用されます。例えば、テキストノードの次のノードが要素ノードであるか、コメントノードであるかなどを判別するために使用できます。

システムエンジニアを目指す初心者の方にとって、nextSibling プロパティは、DOM (Document Object Model) を理解し、XML や HTML ドキュメントをプログラムで操作する上で重要な役割を果たします。Web スクレイピングや、動的なコンテンツ生成など、さまざまな場面で活用できるため、このプロパティの概念と利用方法をしっかりと理解しておくことをお勧めします。

Dom\CharacterData クラスは、テキストデータやコメントなど、文字データを扱うための基底クラスです。したがって、nextSibling プロパティは、これらの文字データに関連するノードを辿る際に特に有効です。

構文(syntax)

1readonly public ?Dom\Node $nextSibling

引数(parameters)

引数なし

引数はありません

戻り値(return)

Dom\Node|null

このプロパティは、現在のノードの直後に続く兄弟ノードを返します。兄弟ノードが存在しない場合は null を返します。

サンプルコード

PHP DOM nextSibling で兄弟ノードを走査する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * Dom\CharacterData の nextSibling プロパティの使用例
7 *
8 * 指定したテキストノードの次の兄弟ノードを順に取得し、
9 * その情報を出力します。
10 */
11function demonstrateDomNextSibling(): void
12{
13    // サンプルとなるHTMLコンテンツ
14    // <p>要素内のノードは「テキスト1」「<b>太字</b>」「テキスト2」の順
15    $html = '<p>テキスト1<b>太字</b>テキスト2</p>';
16
17    // DOMDocumentオブジェクトを作成し、HTMLを読み込む
18    $dom = new DOMDocument();
19    $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
20
21    // <p>要素を取得
22    /** @var \DOMElement $pElement */
23    $pElement = $dom->getElementsByTagName('p')->item(0);
24
25    // 最初のノード("テキスト1"というテキストノード)を取得
26    // DOMText は DOMCharacterData を継承している
27    $currentNode = $pElement->firstChild;
28
29    echo "--- 兄弟ノードの走査開始 ---\n";
30
31    // nextSibling プロパティを使って、次の兄弟ノードがなくなる(nullになる)までループ
32    while ($currentNode !== null) {
33        // ノードの種類に応じて情報を出力
34        switch ($currentNode->nodeType) {
35            // テキストノード (DOMText) の場合
36            case XML_TEXT_NODE:
37                printf(
38                    "種類: テキストノード, 内容: '%s'\n",
39                    trim($currentNode->nodeValue)
40                );
41                break;
42            // 要素ノード (DOMElement) の場合
43            case XML_ELEMENT_NODE:
44                /** @var \DOMElement $currentNode */
45                printf(
46                    "種類: 要素ノード, タグ名: <%s>, 内容: '%s'\n",
47                    $currentNode->tagName,
48                    $currentNode->textContent
49                );
50                break;
51        }
52
53        // nextSibling プロパティで次の兄弟ノードへ移動
54        $currentNode = $currentNode->nextSibling;
55    }
56
57    echo "--- 兄弟ノードの走査終了 ---\n";
58}
59
60// 関数を実行
61demonstrateDomNextSibling();

Dom\CharacterDataクラスのnextSiblingプロパティは、HTMLなどの文書構造において、あるノードのすぐ隣にある次の兄弟ノードを取得するために使用します。兄弟ノードとは、同じ親要素の配下にある、同じ階層のノード同士のことを指します。

このサンプルコードでは、<p>テキスト1<b>太字</b>テキスト2</p>というHTMLを扱っています。この<p>タグの中には、「テキスト1」というテキストノード、<b>という要素ノード、「テキスト2」というテキストノードが、この順番で兄弟として並んでいます。コードは最初に「テキスト1」のノードを取得し、whileループの中でnextSiblingプロパティを繰り返し呼び出すことで、<b>要素、「テキスト2」へと順番にノードをたどり、それぞれの情報を画面に出力しています。

このプロパティは引数を取りません。戻り値として、次の兄弟ノードが存在する場合は、そのノードを表すDom\Node型のオブジェクトを返します。もし現在のノードが最後の兄弟で、次にノードが存在しない場合にはnullを返します。サンプルコードでは、このnullが返される性質をループの終了条件として利用し、すべての兄弟ノードを処理し終えたことを判断しています。

nextSiblingプロパティは、指定したノードの直後にある兄弟ノードを取得します。次の兄弟ノードが存在しない場合はnullを返すため、ループ処理などで利用する際は必ずnullチェックを行ってください。このプロパティが返すノードは、HTMLタグなどの要素だけでなく、テキストやコメント、さらには改行やインデントによる空白文字だけのテキストノードも対象となります。意図しないノードを取得する可能性があるため、取得したノードのnodeTypeプロパティを確認し、種類に応じた処理を記述することが重要です。これにより、予期せぬエラーを防ぎ、より安全なプログラムを作成できます。

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