【PHP】正規表現で使えるオプション(パターン修飾子)まとめ

PHPでは正規表現を文字列として定義します。

例えば次が正規表現パターンの例

このような文字列を検索や置換系の関数に渡すことで正規表現として機能します。

参考記事 : PHPでの正規表現の表現方法や使い方まとめ

 

そしてこの正規表現ではオプションパターン修飾子)も使用可能です。

例えば次は iオプション と mオプション を付けた正規表現の例

上のように最後の /  の後にオプションを表す1文字を並べます。

ここではPHP正規表現で使えるオプションについて記憶の整理も兼ねてまとめてみました。

PHP正規表現のオプションまとめ

全て紹介しませんが、よく使うのは次の6つのオプション

  • iオプション
  • mオプション
  • sオプション
  • xオプション
  • Aオプション
  • Uオプション

ちなみにオプション文字は大文字と小文字が区別されることに注意です。

なので m  を M  にしたり、 A  を a  にしたりするとエラーになります。

これらオプションの使い方やコード例は次の通り

iオプション

パターン内の大文字・小文字の関係なしにマッチさせるオプション

つまりこれを使えば大文字や小文字を区別せずに検索や置換ができるということです。

 

以下iオプションの使用コード例

iオプションを付けたので $pattern  内にある hoge  の大文字・小文字は区別されません。

なのでこのコードの置換結果は次の通り

$subject  の hoge  、 Hoge  、 HOGE  が全て PIYO  に置き換えられます。

 

以上がiオプションの使い方

これは検索とか置換で結構よく使うオプションですね。

mオプション

行頭メタ文字 ^  と行末メタ文字 $  を各行ごとにマッチさせるオプション

通常mオプションをつけないと複数行文字列でも1行として認識されます。

なので ^  は全文字列の最初、 $  は全文字列の最後にしかマッチしません。

それだと不都合な場合、つまり各行でマッチさせる場合に使われるオプションです。

 

以下mオプションを使ったコード例

本来このコードの /^hoge.+hoge$/  みたいに複数行だとドット文字 .  は期待通りに機能しません。

なぜならドット文字は改行を含まないから

しかしmオプションを付けたことで各行ごと(ここでは hoge hoge hoge  )に置換されるようになるので、次のような期待通りの置換結果になります。

こういう風に複数行の置換をするときにmオプションは便利です。

 

以上がmオプションの使い方

これを付けない場合、複数行でも1行と認識される点に注意です。

sオプション

ドット文字を全ての文字にマッチさせるためのオプション

先ほど書いたようにドット文字 .  には改行文字が含まれません。

なので複数行文字列で行をまたいでマッチさせるのに必要なオプションです。

 

以下sオプションの使用コード例

もし単純に /.+/  と書いてしまうと対象文字列の1行目にしかマッチしません。

しかし /.+/s  と書くことで行をまたいで全ての文字列にマッチできます。

なので置換結果は次の通り

全行が置き換えられているのが分かります。

 

以上がsオプションの使い方

使用頻度は低いものの知っておくと役に立つかもしてません。

xオプション

パターン内の空白文字やコメントを無視させるオプション

正規表現をスペースなど使って見やすい形で書くときに便利そうなオプションです。

ちなみにコメントも無視するようですが、調べてもよく分かりませんでした。

 

以下xオプションの使用コード例

上コードの /A  B  C   D  E  F/x  は /ABCDEF/x  と書いたのと同じです。

なので置換結果は次の通り

空白に関係なく正規表現がマッチしているのが分かります。

 

以上がxオプションの使い方

ぎゅうぎゅう詰めの正規表現が嫌いな人はこのオプションが便利かも

Aオプション

パターンを強制的に固定させるためのオプション

もっと簡単にいえば対象文字列の先頭でだけマッチさせるということ

パターンに当てはまる最初の文字列だけ検索したり、置換することができます。

 

以下Aオプションの使用コード例

もしAオプションをつけないなら $subject  の hoge  は全て piyo  に置き換えられます。

しかしこの場合はAオプションを付けたので置換結果は次の通り

最初の hoge  だけが起き返されるという訳です。

 

以上がAオプションの使い方

最初だけ検索したい置換したいという場合に便利なオプションです。

Uオプション

量指定子の「貪欲さ」を反転させるためのオプション

ここでいう量指定子は単語や文字の繰り返しにマッチさせる表現のこと

例えば次で挙げるような

  • *  ⇒ 0文字以上の繰り返し
  • +  ⇒ 1文字以上ん繰り返し
  • {n}  ⇒ n回の繰り返し

などが量指定子としては有名ですね。

 

そしてこの量指定子はデフォルトだと最長一致します。

例えば次のコードを見てください。

上コードの /hoge+/  はeが1回以上繰り替えされたときにマッチします。

そしてデフォルトだと最長マッチなので置換結果は次の通り

$subject  の hogeeeee  に全てマッチしていることが分かります。

こういう風に最長マッチすることを「貪欲」と呼んでいるわけです。

 

ですがUオプションを使うとこの「貪欲」が反転します。

例えば次は先ほどのコードをUオプションを使って書き換えたもの

このコードだと /hoge+/U  は最短マッチになります。

なので置換結果は次の通り

$subject  の hoge  だけにしかマッチしてないのが分かるはず

こういう風に最短マッチするのがUオプションの特徴です。

 

ちなみにUオプションを使わなくても「貪欲さ」は反転できます

その方法とは次のように量指定子のあとに ?  をつけること

もちろん +  だけでなく、 *  とか {n}  とかでも同じ書き方ができます。

 

以上がUオプションの使い方

量指定子全体の「貪欲さ」をコントロールするためのオプションです。

ちなみにJavaScriptの場合は・・・

以上がPHPで使える正規表現オプション

これと同じようにJavaScriptでも正規表現オプションが使用できます。

使用できるのは主に次の4つ

  • gオプション - グローバルサーチ
  • iオプション - 大文字・小文字区別なし
  • mオプション - 複数行にマッチ
  • uオプション - ユニコード値で文字をマッチ

詳しくは次記事でまとめたので良ければご覧ください。

ここまでのまとめ

ここまでで紹介した正規表現オプションをまとめると次の通り

  • iオプション
    大文字または小文字の関係なしにマッチさせる
  • mオプション
    行頭メタ文字 ^  と行末メタ文字 $  を各行ごとにマッチさせる
  • sオプション
    ドット文字 .  を改行文字を含む全ての文字にマッチさせる
  • xオプション
    パターン内の空白文字やコメントを完全に無視させる
  • Aオプション
    パターンを強制的に固定し、対象文字列の先頭でだけマッチさせる
  • Uオプション
    量指定子( +  や *  や {n}  など)の「貪欲さ」を反転させる

他にもオプションはありますが、よく使うのはこの6つだと思います。

以上PHP正規表現で使えるオプション(パターン修飾子)まとめでした。