【PHP8.x】Dom\Element::contains()メソッドの使い方
containsメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
containsメソッドは、指定されたノードが現在のノードの子孫であるかどうかを確認するメソッドです。具体的には、Dom\Elementオブジェクト(XMLドキュメント内の要素)に対して呼び出され、引数として与えられたノードが、その要素の子孫(子、孫、曾孫など)である場合にtrueを、そうでない場合にfalseを返します。
このメソッドは、XMLドキュメントの構造を解析し、特定のノードが別のノードの内部に存在するかどうかを効率的に判断するために使用されます。例えば、特定の要素の中に特定のテキストノードが含まれているか、あるいはある要素の中に別の特定の要素が含まれているかなどを確認する際に役立ちます。
containsメソッドは、DOM(Document Object Model)ツリーにおける親子関係を調べる際に、手動でツリーを辿るよりも簡単かつ高速に判定できるため、XMLドキュメントの操作や検証を行うプログラムにおいて、重要な役割を果たします。
システムエンジニアを目指す初心者の方にとっては、XMLデータを取り扱う際に、特定の要素の内容や構造を検証する場面で活用できるでしょう。例えば、設定ファイルの解析や、Web APIから取得したXMLデータの構造確認などに利用できます。
構文(syntax)
1<?php 2 3$dom = new DOMDocument(); 4$parentElement = $dom->createElement('div'); 5$childElement = $dom->createElement('span'); 6$parentElement->appendChild($childElement); 7 8$isContained = $parentElement->contains($childElement); 9 10?>
引数(parameters)
?Dom\Node $other
- ?Dom\Node $other: 比較対象となるDom\Nodeインスタンス。nullを指定することも可能です。
戻り値(return)
bool
指定された要素がこのDOM要素の子孫である場合に true を、そうでない場合に false を返します。
サンプルコード
PHP Dom\Element::contains() で要素の包含関係を調べる
1<?php 2 3// Dom\Element::contains() のサンプルコード 4 5// HTMLドキュメントを作成 6$dom = new DOMDocument(); 7$dom->loadHTML('<!DOCTYPE html><html><body><div><p>Hello</p></div></body></html>'); 8 9// div要素を取得 10$div = $dom->getElementsByTagName('div')->item(0); 11 12// p要素を取得 13$p = $dom->getElementsByTagName('p')->item(0); 14 15// div要素がp要素を含んでいるか確認 16if ($div && $p && $div->contains($p)) { 17 echo "div要素はp要素を含んでいます。\n"; 18} else { 19 echo "div要素はp要素を含んでいません。\n"; 20} 21 22// span要素を作成(ドキュメントにない要素) 23$span = $dom->createElement('span', 'World'); 24 25// div要素がspan要素を含んでいるか確認(falseになるはず) 26if ($div && $div->contains($span)) { 27 echo "div要素はspan要素を含んでいます。\n"; 28} else { 29 echo "div要素はspan要素を含んでいません。\n"; 30}
PHP 8のDom\Element::contains()メソッドは、あるDOM要素が別のDOMノード(要素やテキストノードなど)を含んでいるかどうかを判定するために使用します。引数には、判定対象となるDom\Nodeオブジェクトを渡します。この引数はnullableであり、nullを渡すことも可能です。
このサンプルコードでは、まずDOMDocumentクラスを使用してHTMLドキュメントを作成し、解析しています。次に、getElementsByTagName()メソッドを使って、div要素とp要素を取得します。
$div->contains($p)を実行することで、div要素がp要素を包含しているかをチェックします。この例ではdiv要素はp要素を含んでいるため、contains()メソッドはtrueを返し、「div要素はp要素を含んでいます。」というメッセージが出力されます。
さらに、span要素を新たに作成し、同様にdiv要素がspan要素を含んでいるかをcontains()メソッドで確認します。このspan要素はHTMLドキュメントには存在しないため、contains()メソッドはfalseを返し、「div要素はspan要素を含んでいません。」というメッセージが出力されます。
contains()メソッドは、指定されたノードが要素の子孫である場合にtrueを、そうでない場合はfalseを返します。これにより、DOMツリー内の要素の親子関係をプログラムで確認することができます。戻り値はbool型です。
Dom\Element::contains()メソッドは、あるDOM要素が別のDOMノード(要素やテキストノードなど)を含んでいるかどうかを判定します。引数 $other には、確認したいノードを渡します。
注意点として、contains()メソッドは、引数に指定されたノードが、メソッドを呼び出した要素の子孫である場合にのみ true を返します。親要素や兄弟要素である場合は false を返します。サンプルコードでは、span要素はまだDOMツリーに挿入されていないため、div要素は span要素を含んでいないと判定されます。
また、contains()メソッドは、PHP 8以降で使用可能です。古いバージョンでは利用できませんので注意してください。DOMDocumentやDOMElementの取得に失敗した場合(null が返された場合)は、contains()メソッドを呼び出す前に null チェックを行うようにしましょう。
Dom\Element::containsメソッドでノード包含を判定する
1<?php 2 3// DOMDocumentを生成 4$dom = new DOMDocument(); 5 6// HTMLをロード 7$dom->loadHTML('<html><body><div id="container"><p>This is a paragraph.</p></div></body></html>'); 8 9// 比較対象のノードを生成 10$newDom = new DOMDocument(); 11$newDom->loadHTML('<p>This is a paragraph.</p>'); 12$paragraph = $newDom->getElementsByTagName('p')->item(0); 13 14// #container要素を取得 15$container = $dom->getElementById('container'); 16 17// containsメソッドを使用して、#container要素が$paragraphノードを含むかどうかを確認 18if ($container->contains($paragraph)) { 19 echo "The container element contains the paragraph node.\n"; 20} else { 21 echo "The container element does not contain the paragraph node.\n"; 22} 23 24// 別のノード(存在しないノード)でテスト 25$newDom2 = new DOMDocument(); 26$newDom2->loadHTML('<p>This is another paragraph.</p>'); 27$paragraph2 = $newDom2->getElementsByTagName('p')->item(0); 28 29// containsメソッドを使用して、#container要素が$paragraph2ノードを含むかどうかを確認 30if ($container->contains($paragraph2)) { 31 echo "The container element contains the paragraph2 node.\n"; 32} else { 33 echo "The container element does not contain the paragraph2 node.\n"; 34} 35?>
このサンプルコードは、PHPのDOM拡張に含まれるDom\Elementクラスのcontainsメソッドの使い方を示しています。containsメソッドは、あるDOM要素が指定されたノードを子孫として含んでいるかどうかを確認するために使用します。
まず、DOMDocumentオブジェクトを作成し、HTMLをロードします。次に、比較対象となるノードを別のDOMDocumentオブジェクトから作成します。サンプルコードでは、<p>要素を比較対象としています。
getElementByIdメソッドを使って、HTML内のid属性がcontainerである要素を取得します。そして、$container->contains($paragraph)のようにcontainsメソッドを呼び出し、$container要素が$paragraphノードを子孫として含んでいるかどうかをチェックします。
containsメソッドは、引数にDom\Nodeオブジェクトを受け取り、Boolean型の値を返します。ノードが子孫として含まれている場合はtrue、そうでない場合はfalseを返します。
サンプルコードでは、存在するノードと存在しないノード($paragraph2)の2つのパターンでcontainsメソッドをテストし、結果をechoで出力しています。これにより、containsメソッドが期待通りに動作することを確認できます。このメソッドを利用することで、DOM構造内でのノードの包含関係を簡単に判定できます。
DomElement::contains()メソッドは、指定されたノードが要素に含まれているかを判定します。引数に渡すノードは、同じDOMDocumentに属している必要があります。サンプルコードでは、$paragraphと$paragraph2がそれぞれ別のDOMDocumentから生成されているため、$container->contains()の結果は、ノードの内容ではなく、DOMツリーにおける親子関係によって決まります。contains()メソッドを正しく使用するには、比較対象のノードが、メソッドを呼び出す要素のDOMDocument内で生成されていることを確認してください。異なるDOMDocumentのノードを比較する場合は、一度DOMDocumentをインポートするなど、同じドキュメント内で処理する必要があります。