Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】RegexIterator::__construct()メソッドの使い方

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

作成日: 更新日:

基本的な使い方

『__constructメソッドは、新しいRegexIteratorインスタンスを生成し、初期化するメソッドです。このメソッドは、既存のイテレータを正規表現のルールに基づいてフィルタリングしたり、加工したりする準備を行います。呼び出す際には、主に2つの必須引数を指定します。最初の引数には、処理の対象となるイテレータオブジェクトを渡します。2番目の引数には、各要素を評価するための正規表現パターンを文字列で指定します。これにより、イテレータを反復処理する際に、各要素が指定した正規表現にマッチするかどうかを判定する準備が整います。さらに、オプションの引数で動作モードを指定することで、単にマッチした要素を返すだけでなく、マッチした部分文字列の配列を取得したり、マッチした箇所で文字列を分割したりするなど、多様な結果を得ることが可能です。このコンストラクタによって、正規表現を利用した柔軟なデータフィルタリング処理を簡単に行うことができます。

構文(syntax)

1public __construct(
2    Iterator $iterator,
3    string $pattern,
4    int $mode = RegexIterator::MATCH,
5    int $flags = 0,
6    int $pregFlags = 0
7)

引数(parameters)

Iterator $iterator, string $pattern, int $mode = 0, int $flags = 0, int $pregFlags = 0

  • Iterator $iterator: 処理対象となるイテレータを指定します。
  • string $pattern: 検索する正規表現パターンを指定します。
  • int $mode = 0: マッチモードを指定します。
  • int $flags = 0: イテレータのフラグを指定します。
  • int $pregFlags = 0: preg_match() のフラグを指定します。

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP RegexIterator で正規表現マッチングする

1<?php
2
3// フィルタリングの元となる文字列の配列を準備します。
4$fruits = [
5    'apple',
6    'banana',
7    'orange',
8    'grape',
9    'apricot',
10    'avocado',
11    'kiwi',
12];
13
14// ArrayIterator を使用して、配列を反復処理可能なイテレータに変換します。
15// これは RegexIterator が処理する「元の」イテレータとなります。
16$arrayIterator = new ArrayIterator($fruits);
17
18// RegexIterator のコンストラクタを使用して、特定の正規表現パターンにマッチする
19// 要素のみを抽出する新しいイテレータを作成します。
20//
21// 引数について:
22// 1. $iterator: フィルタリングの対象となるイテレータのインスタンス(上記で作成した $arrayIterator)。
23// 2. $pattern: フィルタリングに使用する正規表現パターン。
24//             ここでは '/^a/' は「'a' で始まる文字列」を意味します。
25// 3. $mode: フィルタリングのモード。RegexIterator::MATCH は、
26//           マッチした要素そのものを返す(デフォルトの)モードです。
27//           (この例ではデフォルト値と同じなので省略も可能ですが、明示的に示します。)
28$regexIterator = new RegexIterator(
29    $arrayIterator,
30    '/^a/',               // 'a' で始まる文字列にマッチする正規表現
31    RegexIterator::MATCH  // マッチした要素自体を返すモード
32);
33
34echo "「a」で始まるフルーツの一覧:\n";
35
36// foreach ループを使用して、RegexIterator からフィルタリングされた要素を順に取り出し、表示します。
37foreach ($regexIterator as $fruit) {
38    echo "- " . $fruit . "\n";
39}
40
41?>

PHPのRegexIterator::__constructは、RegexIteratorクラスの新しいインスタンスを生成するためのコンストラクタです。このコンストラクタは、既存のイテレータ(配列やコレクションなどを順に処理する仕組み)から、特定の正規表現パターンに合致する要素のみを抽出し、それを反復処理できる新しいイテレータとして提供します。

サンプルコードでは、まずフルーツ名の配列をArrayIteratorで反復可能なイテレータに変換しています。これが、フィルタリングの元となるデータを提供します。 次に、RegexIteratorのコンストラクタを呼び出して、フィルタリングを行う新しいイテレータを作成しています。第一引数には、フィルタリングの対象となる元のイテレータ($arrayIterator)を指定します。第二引数には、フィルタリングの条件となる正規表現パターン'/^a/'を渡しています。これは、「文字列が'a'で始まる」という条件を意味します。第三引数のRegexIterator::MATCHは、正規表現にマッチした要素そのものを結果として返すモードを指定しています。

このコンストラクタは、新しいRegexIteratorのインスタンスを生成するだけであり、特別な戻り値は持ちません。生成された$regexIteratorは、foreachループで反復処理することにより、元のデータの中から正規表現の条件に合致する要素、つまり「a」で始まるフルーツだけを効率的に取り出して表示することができます。これにより、複雑なデータコレクションから特定の条件に合うデータを簡単に抽出する処理を実装できます。

RegexIteratorのコンストラクタを利用する際、第2引数で指定する正規表現パターンは、デリミタで囲み、特殊文字は正しくエスケープするなど、正確な記述が不可欠です。意図しない結果を避けるため、正規表現のルールを理解しましょう。また、RegexIteratorは直接配列を扱わず、ArrayIteratorのようなIteratorオブジェクトをフィルタリングの対象とします。このイテレータの概念を理解することが重要です。第3引数のモードによってフィルタリング結果の形式が変わりますので、RegexIterator::MATCHのように目的のモードを明示的に指定すると、コードの意図が明確になります。

PHP RegexIterator コンストラクタで正規表現マッチング

1<?php
2
3// このサンプルコードは、PHPの RegexIterator クラスのコンストラクタ (__construct) の基本的な使い方を示します。
4// RegexIterator は、既存のイテレータ(ここでは ArrayIterator)の要素を正規表現でフィルタリングするために使用されます。
5// これはシステムエンジニアを目指す初心者が、イテレータと正規表現を組み合わせてデータを処理する概念を理解するのに役立ちます。
6
7// 1. フィルタリングしたい元のデータを含む配列を作成します。
8$data = [
9    'apple pie',
10    'banana split',
11    'orange juice',
12    'apricot jam',
13    'grape fruit',
14    'pineapple chunks',
15    'blueberry muffin',
16];
17
18// 2. ArrayIterator を使って、この配列をイテレータオブジェクトに変換します。
19//    RegexIterator のコンストラクタは、Iterator インターフェースを実装したオブジェクトを第一引数として受け取ります。
20$arrayIterator = new ArrayIterator($data);
21
22// 3. フィルタリングに使用する正規表現パターンを定義します。
23//    ここでは、文字列が 'a' または 'b' で始まる単語にマッチするパターンを定義しています。
24//    '/^([ab])\w+/i' の意味:
25//    - ^: 文字列の先頭
26//    - ([ab]): 'a' または 'b' のいずれか一文字
27//    - \w+: 1文字以上の英数字またはアンダースコア
28//    - /i: 大文字小文字を区別しない (ignore case)
29$pattern = '/^([ab])\w+/i';
30
31// 4. RegexIterator のコンストラクタを呼び出して新しいインスタンスを作成します。
32//    コンストラクタの引数:
33//    - $iterator: フィルタリング対象のイテレータ ($arrayIterator)
34//    - $pattern: 使用する正規表現パターン ($pattern)
35//    - $mode: フィルタリングの動作モード。RegexIterator::MATCH は、パターンにマッチする要素のみを返します。
36//    - $flags: 追加の動作を指定するフラグ(ここでは0でデフォルト動作)
37//    - $pregFlags: PHPの正規表現関数 (preg_matchなど) に渡される追加フラグ(ここでは0でデフォルト動作)
38$regexIterator = new RegexIterator(
39    $arrayIterator,        // フィルタリングの基となるイテレータ
40    $pattern,              // 使用する正規表現パターン
41    RegexIterator::MATCH,  // モード: パターンにマッチする項目のみを返す
42    0,                     // フラグ: 追加のフラグなし (例: RegexIterator::USE_KEY を指定するとキーをフィルタリング対象にする)
43    0                      // preg_match() に渡す追加フラグなし (例: PREG_OFFSET_CAPTURE など)
44);
45
46echo "元のデータ:\n";
47foreach ($data as $item) {
48    echo "- " . $item . "\n";
49}
50echo "\n";
51
52echo "正規表現 '{$pattern}' にマッチする項目:\n";
53echo "---------------------------------\n";
54
55// 5. フィルタリングされた結果をループ処理して表示します。
56//    RegexIterator オブジェクトを foreach で回すと、正規表現にマッチした要素だけが順次取得されます。
57foreach ($regexIterator as $key => $value) {
58    echo "  - " . $value . "\n";
59}
60
61?>

このサンプルコードは、PHPのRegexIteratorクラスのコンストラクタである__constructメソッドの基本的な使い方を示しています。RegexIteratorは、既存のイテレータが持つ要素を特定の正規表現パターンでフィルタリングするために利用されるクラスです。

__constructメソッドは、新しいRegexIteratorインスタンスを生成する際に呼び出され、以下の引数を受け取ります。第一引数には、フィルタリング対象となるデータを保持するIteratorオブジェクトを指定します。サンプルコードでは、配列をイテレータに変換したArrayIteratorを渡しています。第二引数には、フィルタリングの基準となる正規表現パターンを文字列で定義します。ここでは、'a'または'b'で始まる単語にマッチするパターンを設定しています。第三引数の$modeは、フィルタリングの挙動を決定します。サンプルではRegexIterator::MATCHを指定しており、これは正規表現パターンにマッチする要素のみを結果として返すことを意味します。続く$flags$pregFlagsは、より詳細なフィルタリング動作や正規表現エンジンの振る舞いを制御する追加フラグですが、サンプルではデフォルト値の0を使用しています。

このコンストラクタは新しいRegexIteratorオブジェクトを生成するだけで、特定の値を直接返すことはありません。生成されたRegexIteratorオブジェクトをforeachループなどで処理することで、定義された正規表現パターンに合致する要素のみが抽出され、利用可能になります。これにより、元のデータから必要な情報だけを効率的に取り出すことが可能となります。

RegexIteratorのコンストラクタを利用する際は、第一引数に必ずIteratorインターフェースを実装したオブジェクトを渡す必要があります。配列を直接指定することはできませんのでご注意ください。第二引数の正規表現パターンは、意図しない結果を避けるためにも、構文をしっかり理解し、テストで動作確認をすることをおすすめします。特に第三引数の$modeは重要で、RegexIterator::MATCH以外にもRegexIterator::GET_MATCHRegexIterator::REPLACEなどがあり、選択するモードによってフィルタリングの挙動やforeachで取得できる値の形式が大きく異なります。ご自身の目的に合ったモードを正しく選択することが大切です。コンストラクタはRegexIteratorのインスタンスを生成するだけで、フィルタリングされた結果は、そのインスタンスをforeachで反復処理することで取得できます。

関連コンテンツ