【PHP8.x】Dom\Node::contains()メソッドの使い方
containsメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
containsメソッドは、あるDOMノードが、別の特定のDOMノードをその子孫として含んでいるかどうかを判定するメソッドです。このメソッドは、Dom\Nodeクラスのインスタンスに対して呼び出され、引数としてチェック対象となる別のDom\Nodeオブジェクトを受け取ります。
具体的には、呼び出し元のノードが、引数で渡されたノードをDOMツリー内で直接的または間接的な子孫ノードとして持っている場合にtrueを返します。この際、引数のノードが呼び出し元のノード自身である場合も、包含関係があると見なされtrueが返されます。もし包含関係がない、つまり引数のノードが呼び出し元のノードの子孫ではない場合はfalseが返されます。
この機能は、HTMLやXMLドキュメントの構造をPHPで解析したり操作したりする際に非常に有用です。例えば、特定のHTML要素が別のコンテナ要素の内側にあるかどうかを確認したい場合や、ユーザーインターフェースにおける要素の階層的な関係性をプログラムで検証したい場合などに活用できます。Dom\Node::containsメソッドは、DOMツリー内での要素間の関係性を簡潔かつ正確に判断するための基本的なツールとして提供されています。
構文(syntax)
1<?php 2 3// Dom\Documentのインスタンスを作成 4$document = new Dom\Document(); 5 6// 親ノード(div要素)を作成し、ドキュメントに追加 7$parentNode = $document->createElement('div'); 8$document->appendChild($parentNode); 9 10// 子ノード(span要素)を作成し、親ノードに追加 11$childNode = $document->createElement('span'); 12$parentNode->appendChild($childNode); 13 14// 親子関係にない別のノード(p要素)を作成 15$unrelatedNode = $document->createElement('p'); 16 17// 親ノードが子ノードを含んでいるかを確認 18$isContained = $parentNode->contains($childNode); // 結果は true 19 20// 親ノードが関連性のないノードを含んでいるかを確認 21$isNotContained = $parentNode->contains($unrelatedNode); // 結果は false 22 23?>
引数(parameters)
?Dom\Node $other
- ?Dom\Node $other: 比較対象となるDOMノードを指定します。
戻り値(return)
bool
指定されたノードがこのノードの子孫である場合に TRUE を返します。そうでなければ FALSE を返します。
サンプルコード
PHP DOMNode::contains() で子孫ノードを判定する
1<?php 2 3// Dom\Node::contains() メソッドのサンプルコード 4 5// ドキュメントを作成 6$dom = new DOMDocument(); 7$dom->loadHTML('<div><p>Hello</p></div>'); 8 9// ノードを取得 10$div = $dom->getElementsByTagName('div')->item(0); 11$p = $dom->getElementsByTagName('p')->item(0); 12$body = $dom->getElementsByTagName('body')->item(0); 13 14 15// contains() メソッドを使用して、ノードが別のノードの子孫であるかどうかを確認 16if ($div && $p) { 17 if ($div->contains($p)) { 18 echo "div contains p\n"; // div は p を含んでいるので出力される 19 } else { 20 echo "div does not contain p\n"; 21 } 22} 23 24if ($body && $div) { 25 if ($body->contains($div)) { 26 echo "body contains div\n"; // body は div を含んでいるので出力される 27 } else { 28 echo "body does not contain div\n"; 29 } 30} 31 32if ($p && $div) { 33 if ($p->contains($div)) { 34 echo "p contains div\n"; // p は div を含んでいないので出力されない 35 } else { 36 echo "p does not contain div\n"; // こちらが出力される 37 } 38} 39 40?>
このサンプルコードは、PHP 8の Dom\Node クラスにおける contains() メソッドの使い方を示しています。contains() メソッドは、あるノードが別のノードの子孫であるかどうかを判定するために使用されます。引数には、判定対象となるノード(Dom\Node オブジェクト)を $other として渡します。この引数はnullable なので、null を渡すことも可能です。メソッドの戻り値は、bool 型で、引数で指定されたノードが自身のノードの子孫である場合は true、そうでない場合は false を返します。
サンプルコードでは、まず DOMDocument オブジェクトを作成し、HTML文字列をロードしてDOMツリーを構築しています。次に、getElementsByTagName() メソッドを使って、div、p、body の各要素に対応するノードを取得しています。
そして、それぞれのノードに対して contains() メソッドを呼び出し、ノード間の親子関係を確認しています。例えば、$div->contains($p) は、div 要素が p 要素を子孫として含んでいるかどうかをチェックします。if 文を使って、contains() メソッドの結果に応じてメッセージを出力することで、ノード間の親子関係がどのように判定されるかを確認できます。特に、3つ目の例 $p->contains($div) では、p 要素は div 要素を包含していないため、false が返され、対応するメッセージが出力されることを確認できます。このメソッドを使うことで、DOMツリー内でのノードの包含関係を簡単に判定できます。
Dom\Node::contains()は、あるノードが別のノードの子孫であるかを確認するメソッドです。引数には確認したいノードを指定します。$otherがnullの場合、常にfalseを返します。
このメソッドを使う前に、DOMDocumentを適切に作成し、対象のノードを取得する必要があります。getElementsByTagName()などで取得したノードが実際に存在するか、if ($node)のようにチェックしてからcontains()を呼び出すようにしましょう。
また、contains()はノード間の親子関係を判定するものであり、配列や文字列の包含関係を調べるものではありません。PHPで配列の包含関係を調べるには、array_intersect()などの関数を使用します。Dom\Nodeオブジェクトに対してのみ使用できるメソッドである点に注意してください。
PHP DomNode::contains()で子孫ノードを判定する
1<?php 2 3// DomNode::contains() メソッドのサンプル 4 5// ドキュメントを作成 6$dom = new DOMDocument(); 7$dom->loadHTML('<!DOCTYPE html><html><body><div id="container"><p>Hello</p></div></body></html>'); 8 9// ノードを取得 10$container = $dom->getElementById('container'); 11$paragraph = $container->firstChild; // <p> タグ 12 13// contains() メソッドを使って、指定されたノードがノードの子孫かどうかを確認 14if ($container->contains($paragraph)) { 15 echo "The paragraph is a descendant of the container.\n"; 16} else { 17 echo "The paragraph is NOT a descendant of the container.\n"; 18} 19 20// 全く関係のないノードを生成 21$anotherNode = $dom->createElement('span', 'World'); 22 23// contains() メソッドを使って、関係のないノードがノードの子孫かどうかを確認 24if ($container->contains($anotherNode)) { 25 echo "Another node is a descendant of the container.\n"; 26} else { 27 echo "Another node is NOT a descendant of the container.\n"; 28} 29?>
このサンプルコードは、PHPのDOM拡張モジュールにおけるDomNode::contains()メソッドの使い方を示しています。contains()メソッドは、あるDOMノードが別のDOMノードの子孫であるかどうかを判定するために使用します。
まず、DOMDocumentクラスを使ってHTMLドキュメントを作成し、loadHTML()メソッドでHTMLを読み込んでいます。次に、getElementById()メソッドでid属性が"container"である要素を取得し、その最初の子ノード(<p>タグ)を変数$paragraphに格納します。
$container->contains($paragraph)の呼び出しでは、$paragraphが$containerの子孫であるかどうかを確認します。この例では、<p>タグは<div>タグの子要素なので、contains()メソッドはtrueを返し、「The paragraph is a descendant of the container.」と出力されます。
次に、createElement()メソッドで全く関係のない<span>要素を生成し、$anotherNodeに格納します。$container->contains($anotherNode)の呼び出しでは、<span>タグは<div>タグの子孫ではないため、contains()メソッドはfalseを返し、「Another node is NOT a descendant of the container.」と出力されます。
contains()メソッドは、引数にDom\Nodeオブジェクトを受け取り、指定されたノードがメソッドを呼び出したノードの子孫である場合はtrue、そうでない場合はfalseを返します。このメソッドを利用することで、DOMツリー内のノード間の親子関係を容易に判定することができます。
DomNode::contains()メソッドは、あるノードが別のノードの子孫であるかを判定します。引数にはDomNodeオブジェクトを渡します。サンプルコードでは、$containerノードが$paragraphノード(子要素)を含むかどうかを確認しています。
注意点として、contains()メソッドはノード間の親子関係(子孫関係)をチェックするもので、ノードの値が同じかどうかを比較するものではありません。また、引数にnullを渡すと、PHP 8.0以降ではTypeErrorが発生します。PHP 8.0より前のバージョンでは、nullを渡すと常にfalseを返します。別のDOMDocumentに属するノードを渡した場合もfalseが返されます。contains()を使用する際は、ノードが同じDOMDocumentに属しているかを確認することが重要です。