1

小さな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();
4

2 に答える 2

2

まず、explode関数を使用してURLをスラッグに分割し、正規表現をまったく使用しないことで、作業を楽にすることができます。

ただし、正規表現を使用する必要がある場合は、「。*」を「[^/]+」に変更してください。

ドットはスラッシュを含むすべてに一致することを忘れないでください。式「[^/]」は、スラッシュを除くすべてに一致します。

また、文字列がスラッシュで始まる場合は、正規表現をスラッシュで始める必要があります。

最後に、「*」数量詞の代わりに「+」数量詞を使用する必要があります。

投稿の正規表現に対応する次の例を検討してください。

#^/[^/]+/[^/]+(/.*)?$#
#^/[^/]+/?$#
#^/$#
#^/car/[^/]+(/.*)?$#
#^/crazy/url/[^/]+/[^/]+(/.*)?$#
于 2011-01-19T04:31:01.850 に答える
1

これを行うためにpreg_replace関数を使用しました。

preg_replace($ pattern、$ replace、$ string)

preg_replace関数は、正規表現の検索と置換を実行します。これにより、サブジェクトでパターンに一致するものが検索され、それらが置換に置き換えられます。

例:http ://example.com/my-planet-earth/

私は「my-planet-earth」のフォーマットについて話している。ここで、$ stringは「MyPlanetEarth」になり、$urlKeyは「my-planet-earth」になります。$string = "planet + *&john doe / / \ \ ^ 44 5%6 +-@ ku!〜` this " ; $ urlKey = preg_replace(array('/ [^ a-z0-9-] / i'、'/ [] {2、} /'、'/ [] /')、array(''、''、 ' -')、$ string); //出力:planet-john-doe-44-5-6 --- ku-this

お役に立てれば。

于 2011-08-02T12:11:36.783 に答える