MW211 EXIT

devlog
正規表現/後方最短一致
2013年09月09日
例えばあるURLの末尾の階層だけを除外したい場合の正規表現による置換を考えた。
つまり「http://aaa/bbb」を「http://aaa」にする置換だ。

まず「/\.*$」が思いつくが、これは最長一致検索となるので
「//aaa/bbb」が該当してしまい(結果が「http:」となり)うまくいかない。

最短一致検索は「?」を使う方法があるが、これは前方にしか使えないらしく
「/\.*?$」だと「//aaa/bbb」が該当してしまう

ということで試行錯誤した結果こんな感じとなることがわかった。
┌──────────────────────────────────────┐
│preg_replace('/\/[^\/]*$/', '', 'http://aaa/bbb');                          │
└──────────────────────────────────────┘

末尾に「/」がついている場合もあるので、この場合はこう。
┌──────────────────────────────────────┐
│preg_replace('/\/[^\/]*\/$/', '', 'http://aaa/bbb/');                       │
└──────────────────────────────────────┘

両方に対応できるようにまとめるとこう。
┌──────────────────────────────────────┐
│preg_replace('/(\/[^\/]*$|\/[^\/]*\/$)/', '', 'http://aaa/bbb/');           │
└──────────────────────────────────────┘

もっとスマートにまとめればこうだ。
┌──────────────────────────────────────┐
│preg_replace('/\/[^\/]*\/?$/', '', 'http://aaa/bbb/');                      │
└──────────────────────────────────────┘

いずれも「http://aaa」になる。

  ┌───┬────────────────────────────────┐
  │置換前│\/[^\/]*\/?$                                                    │
  ├───┼────────────────────────────────┤
  │置換後│                                                          (なし)│
  └───┴────────────────────────────────┘
分類:正規表現