小さなMVCフレームワークでルーターオブジェクトを構築しています。URL文字列を解析して、コントローラーやアクションなどを検出します。構成可能です。
現在、ユーザーは次のような文字列を渡すことでルートを作成できます。
$this->connect('/:controller/:action/*');
$this->connect('/:controller', array('action' => 'index'));
$this->connect('/', array('controller' => 'static_pages', 'action' => 'index'));
そして、ルーターはそれらから次の正規表現を作成します。
#^(.*)/(.*)/?.*/?$#
#^(.*)/?$#
#^/$#
最後に、ルーターはURLに基づいて正しいルートを選択しようとします。上記のルートのURLは次のようになります。
/cars/get_colors/ # will invoke cars->get_colors();
/cars/ # will invoke cars->index();
/ # will invoke static_pages->index();
でも
私の正規表現は正しくありません。最初の(より具体的な)式は2番目の条件に一致し、2番目の式は最初の条件に一致する可能性があります。
順序を逆にしてチェックインすると、静的ページルートが機能し、次にコントローラーインデックスルートが機能しますが、コントローラーインデックスルートはより具体的なルートをすべてキャッチします。
アップデート
ユーザーは次のようなルートを接続することもできるため、正規表現を使用しています。
$this->connect('/car/:action/*', array('controller' => 'cars');
$this->connect('/crazy/url/:controller/:action/*');
これは、これに似た2つの正規表現を構築します。
#^car/(.*)/?.*/?$#
#^crazy/url/(.*)/(.*)/?.*?$#
最後に、次のルーティングを実行します。
/car/get_colors/ # will invoke cars->get_colors();
/crazy/url/cars/get_colors/ # will invoke cars->get_colors();