PCRE 正規表現構文
PHP Manual

サブパターン

サブパターンは、丸カッコで括られたパターンのことで、ネストも可能です。 パターンの一部をサブパターンにすると、以下の 2 つのことが可能になります。

1. 選択肢の範囲の指定 (localize)。例えば、パターン

      cat(aract|erpillar|)
      
は、単語 "cat", "cataract", "caterpillar" にマッチします。 カッコをつけないと、このパターンは、"cataract", "erpillar" または空の文字列にマッチしてしまいます。

2. サブパターンによる値の取得(キャプチャ)。 パターン全体としてマッチに成功した場合、対象文字列の内、 サブパターンにマッチした部分の値がコールした側に返されます。 開きカッコの数が(1 から始まって)左から右に数えられ、 キャプチャ用サブパターン (capturing subpattern) の番号が指定されます。

例えば、文字列 "the red king" に対し、パターン

      the ((red|white) (king|queen))
      
をマッチングさせた場合、キャプチャされる部分文字列は、 "red king", "red", "king" であり、 それぞれ 1 番, 2 番, 3 番と番号がふられます。

カッコに 2 つの機能があるということが、いつも良い方に働くわけでは ありません。値をキャプチャする必要はないが、グループ分けのために サブパターンを複数用いたい場合も少なくありません。開きカッコの後に "?:" を付けると、そのサブパターンは値のキャプチャを行わず、 キャプチャ用サブパターンの番号としてもカウントされません。例えば、 文字列 "the white queen" に対し、次のパターンをマッチングさせてみましょう。

      the ((?:red|white) (king|queen))
      
キャプチャされる部分文字列は、"white queen" と "queen" であり、 それぞれ 1 番と 2 番に番号付けされます。キャプチャ可能な部分文字列の 数は最大で 99 までです。また、キャプチャを行うものと行わないものを 合わせて、サブパターンの数は最大 200 までです。

簡略形として、値のキャプチャをしないサブパターンの先頭で オプションの設定をする場合、オプションの文字を "?" と ":" の間に入れることができます。つまり、次の 2 つのパターン、

       (?i:saturday|sunday)
       (?:(?i)saturday|sunday)
    

は、まったく同じ文字列集合にマッチします。 選択肢は左から右に試行され、オプションはサブパターンの終端に達するまで リセットされないので、ある選択枝にあるオプション設定は後に続く 選択枝にも作用します。このため、上のパターンは、"Saturday" と同様に "SUNDAY" にもマッチします

PHP 4.3.3 以降、(?P<name>pattern) という記法を用いて サブパターンに名前をつけることができる様になりました。 マッチ時に返される配列には、番号による添字に加えて、指定した文字列を添字とする 要素も含まれます。


PCRE 正規表現構文
PHP Manual