PHPでは正規表現を文字列として定義します。
例えば次が正規表現パターンの例
1 |
'/\w+apple/' |
このような文字列を検索や置換系の関数に渡すことで正規表現として機能します。
参考記事 : PHPでの正規表現の表現方法や使い方まとめ
そしてこの正規表現ではオプション(パターン修飾子)も使用可能です。
例えば次は iオプション と mオプション を付けた正規表現の例
1 |
'/\w+apple/im' |
上のように最後の / の後にオプションを表す1文字を並べます。
ここではPHP正規表現で使えるオプションについて記憶の整理も兼ねてまとめてみました。
PHP正規表現のオプションまとめ
全て紹介しませんが、よく使うのは次の6つのオプション
- iオプション
- mオプション
- sオプション
- xオプション
- Aオプション
- Uオプション
ちなみにオプション文字は大文字と小文字が区別されることに注意です。
なので m を M にしたり、 A を a にしたりするとエラーになります。
これらオプションの使い方やコード例は次の通り
iオプション
パターン内の大文字・小文字の関係なしにマッチさせるオプション
つまりこれを使えば大文字や小文字を区別せずに検索や置換ができるということです。
以下iオプションの使用コード例
1 2 3 4 5 6 7 8 9 |
/** パターン */ $pattern = '/hoge/i'; /** 置換対象の文字列 */ $subject = 'hoge HOge HOGE'; /** 置換を行う文字列 */ $replacement = 'PIYO'; $subject = preg_replace( $pattern, $replacement, $subject ); print_r( $subject ); |
iオプションを付けたので $pattern 内にある hoge の大文字・小文字は区別されません。
なのでこのコードの置換結果は次の通り
1 |
PIYO PIYO PIYO |
$subject の hoge 、 Hoge 、 HOGE が全て PIYO に置き換えられます。
以上がiオプションの使い方
これは検索とか置換で結構よく使うオプションですね。
mオプション
行頭メタ文字 ^ と行末メタ文字 $ を各行ごとにマッチさせるオプション
通常mオプションをつけないと複数行文字列でも1行として認識されます。
なので ^ は全文字列の最初、 $ は全文字列の最後にしかマッチしません。
それだと不都合な場合、つまり各行でマッチさせる場合に使われるオプションです。
以下mオプションを使ったコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** パターン */ $pattern = '/^hoge.+hoge$/m'; /** 置換対象の文字列 */ $subject =<<<EOM hoge hoge hoge hoge hoge hoge hoge hoge hoge EOM; /** 置換を行う文字列 */ $replacement = 'piyo piyo piyo'; $subject = preg_replace( $pattern, $replacement, $subject ); print_r( $subject ); |
本来このコードの /^hoge.+hoge$/ みたいに複数行だとドット文字 . は期待通りに機能しません。
なぜならドット文字は改行を含まないから
しかしmオプションを付けたことで各行ごと(ここでは hoge hoge hoge )に置換されるようになるので、次のような期待通りの置換結果になります。
1 2 3 |
piyo piyo piyo piyo piyo piyo piyo piyo piyo |
こういう風に複数行の置換をするときにmオプションは便利です。
以上がmオプションの使い方
これを付けない場合、複数行でも1行と認識される点に注意です。
sオプション
ドット文字を全ての文字にマッチさせるためのオプション
先ほど書いたようにドット文字 . には改行文字が含まれません。
なので複数行文字列で行をまたいでマッチさせるのに必要なオプションです。
以下sオプションの使用コード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** パターン */ $pattern = '/.+/s'; /** 置換対象の文字列 */ $subject =<<<EOM hoge hoge hoge fuga fuga fuga piyo piyo piyo EOM; /** 置換を行う文字列 */ $replacement = 'hoge fuga piyo'; $subject = preg_replace( $pattern, $replacement, $subject ); print_r( $subject ); |
もし単純に /.+/ と書いてしまうと対象文字列の1行目にしかマッチしません。
しかし /.+/s と書くことで行をまたいで全ての文字列にマッチできます。
なので置換結果は次の通り
1 |
hoge fuga piyo |
全行が置き換えられているのが分かります。
以上がsオプションの使い方
使用頻度は低いものの知っておくと役に立つかもしてません。
xオプション
パターン内の空白文字やコメントを無視させるオプション
正規表現をスペースなど使って見やすい形で書くときに便利そうなオプションです。
ちなみにコメントも無視するようですが、調べてもよく分かりませんでした。
以下xオプションの使用コード例
1 2 3 4 5 6 7 8 9 |
/** パターン */ $pattern = '/A B C D E F/x'; /** 置換対象の文字列 */ $subject = 'ABCDEF'; /** 置換を行う文字列 */ $replacement = 'abcdef'; $subject = preg_replace( $pattern, $replacement, $subject ); print_r( $subject ); |
上コードの /A B C D E F/x は /ABCDEF/x と書いたのと同じです。
なので置換結果は次の通り
1 |
abcdef |
空白に関係なく正規表現がマッチしているのが分かります。
以上がxオプションの使い方
ぎゅうぎゅう詰めの正規表現が嫌いな人はこのオプションが便利かも
Aオプション
パターンを強制的に固定させるためのオプション
もっと簡単にいえば対象文字列の先頭でだけマッチさせるということ
パターンに当てはまる最初の文字列だけ検索したり、置換することができます。
以下Aオプションの使用コード例
1 2 3 4 5 6 7 8 9 |
/** パターン */ $pattern = '/hoge/A'; /** 置換対象の文字列 */ $subject = 'hoge hoge hoge'; /** 置換を行う文字列 */ $replacement = 'piyo'; $subject = preg_replace( $pattern, $replacement, $subject ); print_r( $subject ); |
もしAオプションをつけないなら $subject の hoge は全て piyo に置き換えられます。
しかしこの場合はAオプションを付けたので置換結果は次の通り
1 |
piyo hoge hoge |
最初の hoge だけが起き返されるという訳です。
以上がAオプションの使い方
最初だけ検索したい置換したいという場合に便利なオプションです。
Uオプション
量指定子の「貪欲さ」を反転させるためのオプション
ここでいう量指定子は単語や文字の繰り返しにマッチさせる表現のこと
例えば次で挙げるような
- * ⇒ 0文字以上の繰り返し
- + ⇒ 1文字以上ん繰り返し
- {n} ⇒ n回の繰り返し
などが量指定子としては有名ですね。
そしてこの量指定子はデフォルトだと最長一致します。
例えば次のコードを見てください。
1 2 3 4 5 6 7 8 9 |
/** パターン */ $pattern = '/hoge+/'; /** 置換対象の文字列 */ $subject = 'hogeeeee'; /** 置換を行う文字列 */ $replacement = 'piyooooo'; $subject = preg_replace( $pattern, $replacement, $subject ); print_r( $subject ); |
上コードの /hoge+/ はeが1回以上繰り替えされたときにマッチします。
そしてデフォルトだと最長マッチなので置換結果は次の通り
1 |
piyooooo |
$subject の hogeeeee に全てマッチしていることが分かります。
こういう風に最長マッチすることを「貪欲」と呼んでいるわけです。
ですがUオプションを使うとこの「貪欲」が反転します。
例えば次は先ほどのコードをUオプションを使って書き換えたもの
1 2 3 4 5 6 7 8 9 |
/** パターン(Uオプション使用) */ $pattern = '/hoge+/U'; /** 置換対象の文字列 */ $subject = 'hogeeeee'; /** 置換を行う文字列 */ $replacement = 'piyooooo'; $subject = preg_replace( $pattern, $replacement, $subject ); print_r( $subject ); |
このコードだと /hoge+/U は最短マッチになります。
なので置換結果は次の通り
1 |
piyoooooeeee |
$subject の hoge だけにしかマッチしてないのが分かるはず
こういう風に最短マッチするのがUオプションの特徴です。
ちなみにUオプションを使わなくても「貪欲さ」は反転できます。
その方法とは次のように量指定子のあとに ? をつけること
1 |
'/hoge+?/' |
もちろん + だけでなく、 * とか {n} とかでも同じ書き方ができます。
以上がUオプションの使い方
量指定子全体の「貪欲さ」をコントロールするためのオプションです。
ちなみにJavaScriptの場合は・・・
以上がPHPで使える正規表現オプション
これと同じようにJavaScriptでも正規表現オプションが使用できます。
使用できるのは主に次の4つ
- gオプション - グローバルサーチ
- iオプション - 大文字・小文字区別なし
- mオプション - 複数行にマッチ
- uオプション - ユニコード値で文字をマッチ
詳しくは次記事でまとめたので良ければご覧ください。
ここまでのまとめ
ここまでで紹介した正規表現オプションをまとめると次の通り
- iオプション
大文字または小文字の関係なしにマッチさせる
- mオプション
行頭メタ文字 ^ と行末メタ文字 $ を各行ごとにマッチさせる
- sオプション
ドット文字 . を改行文字を含む全ての文字にマッチさせる
- xオプション
パターン内の空白文字やコメントを完全に無視させる
- Aオプション
パターンを強制的に固定し、対象文字列の先頭でだけマッチさせる
- Uオプション
量指定子( + や * や {n} など)の「貪欲さ」を反転させる
他にもオプションはありますが、よく使うのはこの6つだと思います。
以上PHP正規表現で使えるオプション(パターン修飾子)まとめでした。