【PHP8.x】containsメソッドの使い方

containsメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

containsメソッドは、指定された文字列がDOMCharacterDataオブジェクトの保持する文字データ内に含まれているかどうかを判定するメソッドです。このメソッドはPHP 8.3.0で追加されました。そのため、現在ご利用のPHPバージョンが8.0から8.2の場合、このメソッドは利用できませんのでご注意ください。

DOMCharacterDataクラスは、XMLやHTMLドキュメント内でテキスト、コメント、CDATAセクションなどの文字データを直接表現するノードの基底クラスです。これらのノードが実際に持つ文字列データに対して、特定の文字列が含まれているかを簡単に確認するためにcontainsメソッドが提供されています。

具体的には、containsメソッドは第一引数に検索したい文字列を受け取ります。そして、対象となるDOMCharacterDataオブジェクトが内部に持つ全データ(dataプロパティに相当)の中に、引数で与えられた文字列が部分文字列として存在するかどうかを調べます。もし検索文字列が見つかればtrueを、見つからなければfalseをブール値として返します。この検索は、大文字と小文字を区別して行われます。例えば、コメントノードのテキストに特定のキーワードが含まれているかを確認したり、テキストノードの内容を検証したりする際に役立ちます。

構文(syntax)

1<?php
2$dom = new DOMDocument();
3$textNode = $dom->createTextNode('This is a sample text.');
4$hasSubstring = $textNode->contains('sample');
5?>

引数(parameters)

DOMNode $other

  • DOMNode $other: 検索対象となる別のDOMCharacterDataノード

戻り値(return)

bool

指定された文字列がDOMCharacterDataオブジェクトのテキストコンテンツに含まれているかどうかを示します。含まれている場合はtrue、含まれていない場合はfalseを返します。

サンプルコード

DOMノードが別のノードを含むか判定する

1<?php
2
3/**
4 * DOMCharacterData::contains() の使用例
5 *
6 * 指定されたノードが、DOMCharacterDataノードに含まれているかどうかを確認します。
7 * この例では、テキストノード(DOMText)が、別のテキストノードに含まれているかをチェックしています。
8 * DOMCharacterData::contains() は、DOMText から継承されたメソッドです。
9 */
10
11$dom = new DOMDocument();
12$dom->loadXML('<root><text>Hello World</text></root>');
13
14$root = $dom->documentElement;
15$textNode = $root->firstChild; // DOMTextノードを取得
16
17// 別のテキストノードを作成
18$anotherTextNode = $dom->createTextNode('World');
19
20// $textNode が $anotherTextNode を含んでいるかチェック
21$contains = $textNode->contains($anotherTextNode);
22
23if ($contains) {
24    echo "The text node contains the other text node.\n";
25} else {
26    echo "The text node does not contain the other text node.\n"; // こちらが出力される
27}
28
29?>

PHP 8におけるDOMCharacterDataクラスのcontainsメソッドは、指定されたノードが現在のDOMCharacterDataノードに含まれているかどうかを判定します。DOMCharacterDataは、DOMTextDOMCommentなどのクラスが継承している抽象クラスであり、これらのクラスのインスタンスに対してもcontainsメソッドを使用できます。

サンプルコードでは、まずXMLドキュメントをロードし、<text>要素のテキストノード(DOMTextオブジェクト)を取得しています。次に、createTextNodeメソッドを使用して、別のテキストノードを作成します。

containsメソッドは、DOMNode型の引数 $other を受け取ります。この引数には、包含関係を調べたいノードを指定します。

$textNode->contains($anotherTextNode) の部分で、最初のテキストノードが、後で作成した別のテキストノードを含んでいるかどうかをチェックしています。この例では、$anotherTextNode$textNodeの子ノードではないため、containsメソッドは false を返します。

containsメソッドの戻り値はboolean型で、包含関係がある場合はtrue、ない場合はfalseを返します。この結果に基づいて、条件分岐を行い、メッセージを出力します。サンプルコードを実行すると、「The text node does not contain the other text node.」というメッセージが表示されます。

DOMCharacterData::contains()は、指定されたノードが現在のノードの子孫であるかを判定します。引数にはDOMNodeオブジェクトを渡す必要があります。サンプルコードでは、テキストノードが別のテキストノードを含んでいるかをチェックしていますが、テキストノードの値が一致しているかどうかを判定するものではない点に注意が必要です。contains()はあくまでノード間の親子関係を判定するものです。サンプルコードの例では、$anotherTextNode$textNodeの子ノードではないため、falseが返されます。ノード間の包含関係を正確に理解して使用してください。

PHP DOMCharacterData::contains() でノード包含を判定する

1<?php
2
3// DOMCharacterData::contains() のサンプルコード
4
5// DOMDocumentの作成
6$dom = new DOMDocument();
7
8// テキストノードの作成
9$text = $dom->createTextNode("This is a sample text.");
10
11// 別のテキストノードの作成
12$searchText = $dom->createTextNode("sample");
13
14// DOMCharacterDataとしてテキストノードを扱う
15$characterData = $text;
16
17// contains() メソッドを使用して、searchText が characterData に含まれているか確認
18$contains = $characterData->contains($searchText);
19
20// 結果を出力
21if ($contains) {
22    echo "The text node contains the specified node.\n";
23} else {
24    echo "The text node does not contain the specified node.\n";
25}
26
27?>

このサンプルコードは、PHPのDOM拡張に含まれるDOMCharacterDataクラスのcontains()メソッドの使い方を示しています。contains()メソッドは、PHP 8 で導入された比較的新しいメソッドです。

DOMCharacterDataは、テキストノードやコメントノードなど、文字データを持つノードを扱うためのクラスです。このコードでは、まずDOMDocumentオブジェクトを作成し、createTextNode()メソッドを使ってテキストノードを2つ作成しています。一つは$text、もう一つは$searchTextに格納されます。

$textDOMCharacterDataとして扱い、contains()メソッドを呼び出します。contains()メソッドは、引数にDOMNodeオブジェクトを受け取り、DOMCharacterDataオブジェクト(ここでは$text)が、引数として渡されたノード(ここでは$searchText)を含んでいるかどうかを調べます。

contains()メソッドは、bool型の値を返します。引数として渡されたノードがDOMCharacterDataオブジェクトに含まれている場合はtrue、そうでない場合はfalseを返します。

サンプルコードでは、contains()メソッドの実行結果に応じて、指定されたノードが含まれているかどうかをメッセージとして出力します。この例では $searchText$text の一部であるため、「The text node contains the specified node.」と表示されます。

DOMCharacterData::contains()は、指定されたノードがテキストノード内に含まれているかどうかを判定します。引数にはDOMNodeオブジェクトを渡す必要がありますが、テキストノードの内容(文字列)そのものではなく、DOMノード自体が含まれているかをチェックすることに注意してください。テキストノードに特定の文字列が含まれているかを判定したい場合は、strpos関数などを使用し、DOMCharacterData::dataプロパティでテキストノードの文字列を取得して比較する必要があります。また、渡すノードがDOMDocumentに属している必要があります。異なるDOMDocumentから生成されたノードを渡すと、意図しない結果になる可能性があります。