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

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

作成日: 更新日:

基本的な使い方

containsメソッドは、特定のDOMノードが保持する文字列の中に、指定した部分文字列が含まれているかどうかを確認するメソッドです。このメソッドは、Dom\CharacterDataクラスに属しており、Dom\CharacterDataクラスは、ウェブページの構造を表すDOM(Document Object Model)において、テキスト、コメント、CDATAセクションなど、文字データを直接保持するノードの基底クラスです。したがって、これらの文字データノードが持つテキストコンテンツに対して、特定の文字列が含まれているかを効率的に調べることができます。

利用する際は、検索したい部分文字列を引数として渡します。メソッドは、ノードの持つ文字列全体からその部分文字列を探し、見つかった場合には論理値のtrue(真)を返し、見つからなかった場合にはfalse(偽)を返します。これにより、例えばHTMLドキュメントのコメントに特定の情報が含まれているかを確認したり、ユーザーが入力したテキストノードの内容を検証したりする際に非常に便利です。検索は大文字と小文字を区別して行われるため、正確な文字列の一致を判定する際に役立ちます。このメソッドはPHP 8.3.0以降で利用可能です。

構文(syntax)

1<?php
2$booleanResult = $domCharacterDataInstance->contains('検索する文字列');

引数(parameters)

?Dom\Node $other

  • ?Dom\Node $other: 比較対象となる Dom\Node オブジェクト。このノードが現在のノードに含まれているかを判定します。

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHPで配列に値が含まれるかチェックする

1<?php
2
3/**
4 * 指定された配列が特定の値を含むかどうかをチェックします。
5 *
6 * この関数は、PHPの標準関数である in_array() のラッパーとして機能し、
7 * より直感的な 'contains' という名前で配列の包含チェックを提供します。
8 * これは、PHPのDOM拡張にある 'Dom\Node::contains' メソッドとは異なり、
9 * 配列の要素を検索するために設計されています。
10 *
11 * @param mixed $needle 検索する値。
12 * @param array $haystack 検索対象となる配列。
13 * @param bool $strict 厳密な型チェックを行うかどうか。trueの場合、in_array() は型の比較も行います。
14 * @return bool 配列が値を含む場合は true、含まない場合は false を返します。
15 */
16function contains(mixed $needle, array $haystack, bool $strict = false): bool
17{
18    // in_array() 関数を使用して、配列内に値が存在するかどうかをチェックします。
19    // 第3引数に $strict を渡すことで、型の厳密な比較を行うかを制御できます。
20    return in_array($needle, $haystack, $strict);
21}
22
23// --- 使用例 ---
24
25// 数値を含む配列
26$numbers = [1, 2, 3, 4, 5];
27echo "配列: " . implode(", ", $numbers) . "\n";
28
29// 配列が3を含むかチェック
30if (contains(3, $numbers)) {
31    echo "3 は配列に含まれています。\n"; // 出力: 3 は配列に含まれています。
32} else {
33    echo "3 は配列に含まれていません。\n";
34}
35
36// 配列が6を含むかチェック
37if (contains(6, $numbers)) {
38    echo "6 は配列に含まれています。\n";
39} else {
40    echo "6 は配列に含まれていません。\n"; // 出力: 6 は配列に含まれていません。
41}
42
43echo "\n";
44
45// 文字列を含む配列
46$fruits = ['apple', 'banana', 'cherry'];
47echo "配列: " . implode(", ", $fruits) . "\n";
48
49// 配列が 'banana' を含むかチェック
50if (contains('banana', $fruits)) {
51    echo "'banana' は配列に含まれています。\n"; // 出力: 'banana' は配列に含まれています。
52} else {
53    echo "'banana' は配列に含まれていません。\n";
54}
55
56// 配列が 'grape' を含むかチェック
57if (contains('grape', $fruits)) {
58    echo "'grape' は配列に含まれています。\n";
59} else {
60    echo "'grape' は配列に含まれていません。\n"; // 出力: 'grape' は配列に含まれていません。
61}
62
63echo "\n";
64
65// 厳密な型チェックの例
66$mixedArray = [1, '2', 3.0, true];
67echo "配列 (厳密チェック): " . implode(", ", $mixedArray) . "\n";
68
69// 検索値が文字列 '2' の場合 (非厳密モード)
70if (contains('2', $mixedArray)) {
71    echo "非厳密モード: '2' は配列に含まれています。\n"; // 出力: 非厳密モード: '2' は配列に含まれています。 (数値の2と一致するため)
72}
73
74// 検索値が文字列 '2' の場合 (厳密モード)
75if (contains('2', $mixedArray, true)) {
76    echo "厳密モード: '2' は配列に含まれています。\n";
77} else {
78    echo "厳密モード: '2' は配列に含まれていません。\n"; // 出力: 厳密モード: '2' は配列に含まれていません。 (型が異なるため)
79}
80
81?>

PHPのcontains関数は、指定された配列の中に特定の値が含まれているかどうかを簡単に確認するための関数です。これは、PHPの標準機能であるin_array()関数をより直感的な名前で利用できるようにしたラッパー関数であり、HTMLやXML文書の要素を扱うDom\CharacterData::containsメソッドとは異なり、配列の要素を検索するために設計されています。

この関数は3つの引数を取ります。1つ目の$needleは検索したい値を指定します。2つ目の$haystackは、その値を探したい配列を指定します。3つ目の$strictはオプションの引数で、trueを設定すると、検索時に値だけでなく型も厳密に比較するかどうかを制御できます。例えば、数値の1と文字列の'1'は通常モードでは同じとみなされますが、厳密モードでは異なるものとして扱われます。

関数は、配列内に$needleで指定した値が見つかった場合にtrueを、見つからなかった場合はfalseをブール値として返します。これにより、条件分岐などで配列の包含状態を簡単にチェックできます。

提示されたcontains関数は、配列内に特定の値が存在するかを判定するもので、PHP標準のin_array()関数をより直感的な名前で利用できるようにラップしたものです。この関数は、リファレンス情報にあるDOM関連のDom\CharacterData::containsメソッドとは全く異なり、DOMノードの包含関係ではなく、配列の要素を検索するために設計されています。

特に注意すべきは、第3引数の$strictです。デフォルトでは型を考慮せず値を比較するため、1"1"のような異なる型でも値が同じと判断されることがあります。厳密な型チェックが必要な場合は$stricttrueに設定し、予期せぬ挙動を防ぐようにしてください。この関数は検索結果をbool値で返します。

PHP DOMノード内容をstr_containsでチェックする

1<?php
2
3/**
4 * PHP 8 で Dom\CharacterData ノードのテキスト内容が特定の文字列を含むかチェックする例。
5 *
6 * プログラミング言語リファレンス情報に記載されている Dom\CharacterData::contains メソッドは
7 * PHPのDOM拡張には存在しません。このコードは、Dom\CharacterData の nodeValue プロパティと
8 * PHP 8 の str_contains() 関数を組み合わせて、テキストの包含チェックを行う方法を示します。
9 *
10 * @param DOMCharacterData $node        チェック対象の Dom\CharacterData ノード (例: DOMText, DOMComment)。
11 * @param string           $searchString 検索する文字列。
12 * @return bool 指定した文字列が含まれていれば true、そうでなければ false。
13 */
14function checkCharacterDataNodeContent(DOMCharacterData $node, string $searchString): bool
15{
16    // Dom\CharacterData ノードの実際のテキスト値を取得します。
17    // 例: <p>Hello World</p> の中の "Hello World"
18    $nodeValue = $node->nodeValue;
19
20    // PHP 8 の str_contains() 関数を使用して、テキストが検索文字列を含むかチェックします。
21    return str_contains($nodeValue, $searchString);
22}
23
24// --- 使用例 ---
25
26// 新しい DOMDocument を作成
27$dom = new DOMDocument();
28// XML ドキュメントを読み込む
29$dom->loadXML('<root><greeting>Hello PHP World!</greeting><comment><!-- Important comment --></comment></root>');
30
31// greeting タグ内のテキストノードを取得 (DOMText は DOMCharacterData の一種)
32$greetingTextNode = $dom->getElementsByTagName('greeting')->item(0)->firstChild;
33
34// comment タグ内のコメントノードを取得 (DOMComment も DOMCharacterData の一種)
35$commentNode = $dom->getElementsByTagName('comment')->item(0)->firstChild;
36
37// テキストノードに対する包含チェック
38if ($greetingTextNode instanceof DOMCharacterData) {
39    echo "Greeting node ('" . $greetingTextNode->nodeValue . "') contains 'PHP': "
40        . (checkCharacterDataNodeContent($greetingTextNode, 'PHP') ? 'Yes' : 'No') . PHP_EOL; // 出力: Yes
41
42    echo "Greeting node ('" . $greetingTextNode->nodeValue . "') contains 'Java': "
43        . (checkCharacterDataNodeContent($greetingTextNode, 'Java') ? 'Yes' : 'No') . PHP_EOL; // 出力: No
44}
45
46// コメントノードに対する包含チェック
47if ($commentNode instanceof DOMCharacterData) {
48    echo "Comment node ('" . $commentNode->nodeValue . "') contains 'Important': "
49        . (checkCharacterDataNodeContent($commentNode, 'Important') ? 'Yes' : 'No') . PHP_EOL; // 出力: Yes
50
51    echo "Comment node ('" . $commentNode->nodeValue . "') contains 'Deprecated': "
52        . (checkCharacterDataNodeContent($commentNode, 'Deprecated') ? 'Yes' : 'No') . PHP_EOL; // 出力: No
53}
54
55?>

提供されたリファレンス情報に記載されているDom\CharacterData::containsメソッドは、PHP 8のDOM拡張には実際には存在しません。このサンプルコードは、その代替として、Dom\CharacterData型のノード(テキストノードやコメントノードなど)が持つテキスト内容に特定の文字列が含まれるかをチェックする実用的な方法を示しています。

コードの中心となるcheckCharacterDataNodeContent関数は、二つの引数を受け取ります。第一引数$nodeには、チェック対象となるDOMCharacterDataノード(例: DOMText, DOMComment)を指定します。第二引数$searchStringには、ノードのテキスト内容に含まれるかを確認したい文字列を渡します。関数内部では、まず$node->nodeValueプロパティからノードの実際のテキスト値を取得します。その後、PHP 8で導入されたstr_contains()関数を使って、このテキスト値が$searchStringを含んでいるかを判定します。文字列が含まれていればtrueを、含まれていなければfalseを戻り値として返します。

使用例では、まず新しいDOMDocumentを作成し、XML文字列を読み込んでいます。そして、特定のタグからテキストノードとコメントノードを取得し、それぞれに対してcheckCharacterDataNodeContent関数を呼び出しています。これにより、例えば「Hello PHP World!」というテキストが「PHP」を含むか、「<!-- Important comment -->」というコメントが「Important」を含むかといったチェックを簡単に行うことができます。このアプローチは、DOMツリー内の文字データを効率的に検索する際に役立ちます。

このサンプルコードの最も重要な注意点は、リファレンス情報に記載された Dom\CharacterData::contains メソッドが、PHP 8のDOM拡張には実際には存在しないことです。コードは、テキストを含む Dom\CharacterData ノード(DOMTextDOMCommentなど)から nodeValue プロパティでテキストを取得し、PHP 8で導入された str_contains() 関数を使用して、テキストが特定の文字列を含むか安全にチェックする代替手段を提供しています。初心者の皆さんは、公式リファレンスや情報が常に現状と一致しているとは限らない点に注意し、実際に利用可能な機能を確認する習慣をつけましょう。str_contains() はPHP 8以降でのみ使用可能です。