PHP には正規表現を取り扱う機能があります。よくこれで扱うのは一行に収まる様な文字列、あるいは全体を一行とみなしても問題ないような文字列です。しかしながら複数行にわたる文字列を行を意識して正規表現したい場合もあります。そういった時に便利な機能であるパターン修飾子である修飾子mと修飾子sを紹介します。
PHPの正規表現のパターン修飾子とは正規表現の挙動を変更するために正規表現に付け加える修飾子のことです。これは例えば次の様に用います。
$text = 'Hello World!'; $pattern = '/world/i'; if (preg_match($pattern, $text)) { echo 'マッチしました!'; }
正規表現を表すデリミタの後にパターン修飾子を付け加えることで用います。複数のパターン修飾子を同時に使うことも可能です。例では大文字と小文字を区別しなくする”i”を用いたことで world が World にマッチするようになりました。
修飾子mと修飾子sについての説明です。PHPのドキュメントの次ページに詳細な説明があります。
PHP: 正規表現パターンに使用可能な修飾子 – Manual
修飾子 m は複数行モード(Multiline mode)を表します。これを設定すると^と$の動作が変わります。より詳しくいうと、m修飾子が設定されている場合、^は文字列の始まりだけでなく、各行の始まりもマッチし、$は文字列の末尾そのものや末尾の改行文字だけでなく、各行の終わりにもマッチします。これによって複数行の文字列に対して1行ずつパターンマッチングを行うことができます。これを用いると次の様になります。
<?php $text = <<<TXT 123 abc def TXT; preg_match("/^abc$/", $text, $matches); // マッチしない。^は文字列全体の始まりを表す。$は文字列全体の終わりか終端の改行文字の前を表す。 var_dump($matches); // array(0) { } preg_match("/^abc$/m", $text, $matches); // マッチする。m 修飾子により、各行の始まりと終わりに ^ と $ がマッチする。 var_dump($matches); // array(1) { // [0]=> // string(3) "abc" //}
こんな感じで修飾子mを用いると複数行文字列の中の各行を意識した正規表現を作ることができます。
修飾子 s を設定すると”.”が改行文字を含む任意の一文字にマッチするようになります。デフォルトの”.”は改行文字にマッチしません。s修飾子を使うことで任意文字で行をまたいでなんやかんやできます。これを用いると次の様にできます。
<?php $text = <<<TXT ABC Hello World XYZ TXT; preg_match("/ABC(.*)XYZ/", $text, $matches);// マッチしない。"."は改行文字を含まない。 var_dump($matches); // array(0) { } preg_match("/ABC(.*)XYZ/s", $text, $matches);// マッチする。"."は改行文字を含む様になる。 var_dump($matches); /* array(2) { [0]=> string(19) "ABC Hello World XYZ" [1]=> string(13) " Hello World " } */
こんな感じで修飾子sを用いると複数行にわたる正規表現のパーツを容易に記述できます。
以上がPHPで正規表現を用いて複数行の文字列を柔軟に操作するためのパターン修飾子「m」と「s」の紹介です。これらの修飾子を使うことで複数行文字列の扱いが比較的容易になります。