【PHP8.x】containsメソッドの使い方
containsメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
containsメソッドは、DOMElementノードが別のノードの子孫ノードであるかどうかを判定するメソッドです。具体的には、メソッドを呼び出すDOMElementノード(親ノード候補)が、引数として与えられたノード(子ノード候補)の祖先ノードである場合にtrueを返します。言い換えると、引数のノードが、メソッドを呼び出すノードの子、孫、あるいはそれより深い階層の子孫である場合にtrueを返します。
このメソッドは、DOMツリー構造内でのノード間の親子関係を検証する際に非常に役立ちます。例えば、特定の要素が別の要素の内側に存在するかどうかを確認したい場合や、特定の要素が特定の要素の子孫要素として存在することを保証したい場合などに使用できます。
引数には、判定対象となるDOMNodeオブジェクトを指定します。この引数が、メソッドを呼び出すDOMElementノードの子孫であるかどうかを判定します。もし引数がDOMElementノードの子孫であれば、メソッドはtrueを返します。そうでなければ、falseを返します。
このメソッドは、名前空間を考慮しません。ノードが子孫であるかどうかのみを判定します。名前空間が異なる場合でも、DOMツリー構造上の親子関係があればtrueを返します。 containsメソッドは、DOMDocumentオブジェクト全体を検索するわけではありません。あくまでメソッドを呼び出すDOMElementノードを基準とした子孫関係のみを判定します。
構文(syntax)
1DOMElement::contains(DOMNode $other): bool
引数(parameters)
DOMNode|DOMNameSpaceNode|null $other
- DOMNode|DOMNameSpaceNode|null $other: 比較対象となるノード。nullを指定するとfalseを返します。
戻り値(return)
bool
指定されたDOMElementが、この要素の子孫要素に含まれているかどうかを判定します。含まれている場合は true、含まれていない場合は false を返します。
サンプルコード
DOMElement::contains で要素の包含関係を調べる
1<?php 2 3// DOMElement::contains() メソッドのサンプルコード 4 5// ドキュメントを生成 6$dom = new DOMDocument(); 7$dom->loadHTML('<!DOCTYPE html><html><body><div id="container"><p>This is a paragraph.</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 "container は paragraph を含んでいます。\n"; 16} else { 17 echo "container は paragraph を含んでいません。\n"; 18} 19 20// container 自体も包含関係にあるか確認 21if ($container->contains($container)) { 22 echo "container は container 自身を含んでいます。\n"; 23} else { 24 echo "container は container 自身を含んでいません。\n"; 25} 26 27// 存在しないノードの場合 28$newElement = $dom->createElement('span'); 29if ($container->contains($newElement)) { 30 echo "container は newElement を含んでいます。\n"; 31} else { 32 echo "container は newElement を含んでいません。\n"; // こちらが出力される 33} 34 35?>
PHPのDOMElementクラスにおけるcontainsメソッドは、あるDOM要素が別のノードを含んでいるかどうかを確認するために使用します。PHP 8で利用可能です。引数には、DOMNode、DOMNameSpaceNode、またはnullを指定できます。確認したいノード($other)を引数として渡し、戻り値はboolean型で、包含関係がある場合はtrue、ない場合はfalseを返します。
上記のサンプルコードでは、まずDOMDocumentオブジェクトを作成し、HTMLを読み込んでDOMツリーを構築しています。次に、getElementByIdメソッドでidがcontainerの要素を取得し、その最初の子ノード(<p>要素)を変数$paragraphに格納しています。
containsメソッドを使って、$container要素が$paragraph要素を含んでいるかを確認しています。この例では<p>要素は<div>要素($container)の子要素なので、trueが返り、「container は paragraph を含んでいます。」と出力されます。
また、$container自身を引数に渡してcontainsメソッドを実行することで、要素が自分自身を包含しているかどうかを確認できます。この場合もtrueが返り、「container は container 自身を含んでいます。」と出力されます。
最後に、まだDOMツリーに追加されていない新しい要素($newElement)を作成し、$containerがこれを含んでいるか確認しています。当然ながら、まだ追加されていない要素は包含関係にないので、falseが返り、「container は newElement を含んでいません。」と出力されます。
DOMElement::contains()メソッドは、あるDOMElementノードが、引数で指定されたノードを包含しているかを確認します。
引数にはDOMNode, DOMNameSpaceNode, nullのいずれかを指定可能です。
このメソッドは、ノードの親子関係や先祖-子孫関係を判定する際に役立ちます。
注意点として、引数に指定するノードは、必ずしも同一のDOMDocumentに属している必要はありません。
また、contains()メソッドは、ノード自身を引数に指定した場合もtrueを返します。
存在しないノード、または関係のないノードを引数に指定した場合はfalseが返ります。
nullを引数に指定すると、常にfalseを返します。
このメソッドは、DOM構造を操作する上で、予期せぬエラーを防ぐための重要なチェック機能として利用できます。
PHP DOMElement::contains で要素の包含関係を確認する
1<?php 2 3// DOMDocumentを生成 4$dom = new DOMDocument(); 5 6// HTMLをロード 7$dom->loadHTML(' 8<!DOCTYPE html> 9<html> 10<head> 11 <title>DOMElement::contains サンプル</title> 12</head> 13<body> 14 <div id="container"> 15 <p id="paragraph">This is a paragraph.</p> 16 </div> 17</body> 18</html> 19'); 20 21// container要素を取得 22$container = $dom->getElementById('container'); 23 24// paragraph要素を取得 25$paragraph = $dom->getElementById('paragraph'); 26 27// container要素がparagraph要素を含んでいるか確認 28if ($container && $paragraph && $container->contains($paragraph)) { 29 echo "container要素はparagraph要素を含んでいます。\n"; 30} else { 31 echo "container要素はparagraph要素を含んでいません。\n"; 32} 33 34// 新しい要素を作成し、含んでいるか確認 35$newElement = $dom->createElement('span', 'New Span'); 36 37if ($container && $newElement && $container->contains($newElement)) { 38 echo "container要素は新しいspan要素を含んでいます。\n"; 39} else { 40 echo "container要素は新しいspan要素を含んでいません。\n"; 41} 42 43?>
このPHPのサンプルコードは、DOMElementクラスのcontainsメソッドの使い方を示しています。containsメソッドは、あるDOMElementノードが、引数に指定されたノードを包含しているかどうかを判定します。
まず、DOMDocumentオブジェクトを生成し、HTMLドキュメントをロードします。そして、getElementByIdメソッドを使って、"container"と"paragraph"というIDを持つ要素を取得します。
$container->contains($paragraph)という部分がcontainsメソッドの利用例です。ここでは、"container"要素が"paragraph"要素を包含しているかを確認しています。containsメソッドは、引数に指定されたノードが、メソッドを呼び出したノードの子孫ノードである場合にtrueを、そうでない場合にfalseを返します。サンプルコードでは、"container"要素は"paragraph"要素を包含しているので、trueが返り、対応するメッセージが表示されます。
次に、createElementメソッドを使って新しいspan要素を作成し、同様にcontainsメソッドで"container"要素が新しいspan要素を包含しているか確認します。新しいspan要素はまだDOMツリーに追加されていないため、containsメソッドはfalseを返し、別のメッセージが表示されます。
containsメソッドは、DOMツリー構造におけるノード間の親子関係を判定する際に非常に便利なメソッドです。引数 $other には、包含関係を確認したい DOMNode、DOMNameSpaceNode、または null を指定できます。
DOMElement::contains()メソッドは、ある要素が別の要素を含んでいるかを確認する際に使用します。引数 $other には、含んでいるかどうかを確認したいノード(DOMNode または DOMNameSpaceNode)を指定します。
注意点として、このメソッドは要素の親子関係だけでなく、子孫要素も含むかどうかを判定します。サンプルコードでは、最初に paragraph 要素が container 要素の子要素であるため、true が返されます。次に、新しい span 要素は container 要素に追加されていないため、false が返されます。
getElementById() が null を返す可能性があるため、contains() メソッドを呼び出す前に、$container と $paragraph が null でないことを確認する必要があります。また、contains() メソッドはノード間の包含関係を判定するものであり、属性値やテキスト内容の一致を調べるものではありません。