MW211 EXIT

devlog
PHP/正規表現の置換で文字列を除去(抽出)
2011年11月06日
「preg_replace()」は正規表現が使える便利な置換関数だ。

例えば「ABCDE」という文字列があったとして、
「B」より前を除去したい場合は「^.*B」を
「」(空文字)に置換するように指定すればよい。
┌──────────────────────────────────────┐
│preg_replace('/^.*B/', '', 'ABCDE');                               →「CDE」│
└──────────────────────────────────────┘
「^」は先頭を表し、「.*」は一種のワイルドカードみたいなものだ

一方、「D」より後を除去したい場合は、「D.*$」を「」に置換だ
┌──────────────────────────────────────┐
│preg_replace('/D.*$/', '', 'ABCDE');                               →「ABC」│
└──────────────────────────────────────┘
「$」は末尾を表す

では、この二つを同時に行い「C」のみを抽出したい場合には?
一時変数を使って順番に二段階で処理すればできそうだが(実際にできるが)
なんと、一発でできてしまう。
┌──────────────────────────────────────┐
│preg_replace('/^.*B|D.*$/', '', 'ABCDE');                            →「C」│
└──────────────────────────────────────┘
「|」は「or」みたいなもんで、前出の二つのいずれかに該当したものを
一気に処理してくれる。
もちろん「|」の前後を入れ替え可能、結果は同じだ。
┌──────────────────────────────────────┐
│preg_replace('/D.*$|^.*B/', '', 'ABCDE');                            →「C」│
└──────────────────────────────────────┘

では、互いの領域まで侵犯する入れ子状態の置換はどうなるのだろうか?
「A~D」と「B~E」を同時に置換で除去してしまう。
ってことで「BCD」が両方でかぶってる場合だ。

こんな感じの結果だった。
┌──────────────────────────────────────┐
│preg_replace('/^.*D|B.*$/', '', 'ABCDE');                            →「E」│
└──────────────────────────────────────┘
「ABCDE」─(「A~D」を置換」)→「E」─(「B」がみつからず置換できず)→「E」
…ってな感じだろうか。

それじゃ、「|」の前後を逆にしたらどうだろう?
「ABCDE」─(「B~E」を置換」)→「A」─(「D」がみつからず置換できず)→「A」
…かと思いきや
┌──────────────────────────────────────┐
│preg_replace('/B.*$|^.*D/', '', 'ABCDE');                            →「E」│
└──────────────────────────────────────┘
で、変わらず。

文字列の先頭から処理していくのが原則みたいだ。
分類:PHP