PHPのお勉強!

PHP TOP

内部オプション設定

PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL PCRE_UNGREEDY, PCRE_EXTRA, PCRE_EXTENDED および PCRE_DUPNAMES オプションの設定は、パターン中で変更できます。これには、Perl オプション文字を "(?" と ")" とで括った並びを用います。 オプション文字には以下のものがあります。

内部オプション文字
i PCRE_CASELESS
m PCRE_MULTILINE
s PCRE_DOTALL
x PCRE_EXTENDED
U PCRE_UNGREEDY
X PCRE_EXTRA (PHP 7.3.0 以降はサポートされません)
J PCRE_INFO_JCHANGED

例えば、(?im) は、大小文字を区別しない、複数行モードのマッチングを 設定します。ハイフンを前につけることにより、そのオプションを 解除することも可能です。 (?im-sx) のように設定と解除とを 組み合わせることも可能です。この場合、PCRE_CASELESSPCRE_MULTILINE とが設定され、PCRE_DOTALLPCRE_EXTENDED とが解除されます。 オプション文字がハイフンの前にも後にも指定された場合、 そのオプションは解除されます。

オプションの変更がトップレベル(つまりサブパターンのカッコの外)で行われた場合、 その変更はパターンの後ろの部分に適用されます。 パターン /ab(?i)c/ は "abc" および "abC" にマッチします。

サブパターンの内部でオプションの変更を行った場合は、 その効果は違ったものになります。この動作変更は、Perl 5.005 で行われました。サブパターン中のオプション変更は、そのサブパターンの 設定が行われた場所以降の部分にのみ影響します。そのため、パターン (a(?i)b)c は、abc および aBc にマッチし、他の文字列にはマッチしません (PCRE_CASELESS が設定されていないと仮定)。このように、パターンの各場所に 異なった設定を行うようなオプション指定が可能です。 ある選択肢に行われた設定変更は、同じサブパターン中の後に続く選択肢に 波及します。例えば、パターン (a(?i)b|c) は、"ab", "aB", "c", "C" にマッチします。"C" にマッチする場合を 見てみると、オプション設定が行われている最初の選択肢は マッチせずに捨てられてしまっています。それでも、オプションの設定は 行われ "C" にマッチします。これは、オプション設定の効果が コンパイル時に生じることによります。さもないと、 非常に奇妙な動作をするかもしれません。

PCRE 特有のオプション PCRE_UNGREEDY および PCRE_EXTRA は、 それぞれ文字 U および X を用いて、Perl 互換のオプションと同様に 変更することが可能です。 (?X) フラグの設定は特別で、最上位においても、 パターン中で他の設定を有効にする前に指定する必要があります。 このフラグは、最初に指定するのが最善です。

add a note

User Contributed Notes 2 notes

up
3
mike at clove dot com
14 years ago
When using the (?i:foo) syntax, it appears that the group is not included in the 'matches' argument unless it is nested in an additional set of parenthesis, for example: ((?i:foo))
up
2
mati_ at zenbe dot com
15 years ago
There is also the possibility to enable Modifier only on a specific group, so that the Modifier doesn't stay valid until end or deactivation with "(?-<modifier>)".

The Syntax for that is "?<modifier>:" on the beginning of the group, i.e. (?i:foo) matches on FoO.
To Top