1

サブパターンを操作するためにいくつかの正規表現をテストしているので、PHPを介して各URIセグメントに定義されたルールを適用できます。それらのセグメントのいくつかはオプションなので、私はこれを試しました:

preg_match('#^/(?P<controller>[\w-]+)(?:/(?P<[\w-]+)(?:/(?P<id>[\d]+)))/?$#uD', '/blog/post', $matches);

2番目と3番目のパラメーターはどちらもオプションであるため、この正規表現は一致し/blog/post/1ますが、正しくはなりません。blog/post手がかりはありますか?

4

1 に答える 1

4

なぜ2番目と3番目の部分はオプションなのですか??それらをオプションにするものはありません。あなた?が持っているものは最後のスラッシュにのみ適用されます。また、2番目のグループが存在する場合は、3番目のグループがまだオプションであることを確認する必要があります。多分あなたはこのようなものを探していました:

'#^/(?P<controller>[\w-]+)(?:/(?P<item>[\w-]+)(?:/(?P<id>[\d]+))?)?/?$#uD'

あなたの質問では、2番目のキャプチャグループは有効ではなかったことに注意してください。これは、<フォローするグループ名ではなく、オープニングがあったためです。質問のタイプミスかもしれないと思ったので、それを変更しました。

ただし、正規表現とは異なるアプローチを採用した場合は、コードの可読性が大幅に向上する可能性があります。で爆発してみませんか/。次に$result[1]、コントローラーになります。次に、が存在するかどうか$result[2]を確認し、それが有効な「アイテム」(またはあなたがそれを呼んでいるもの)であることを確認できます。そして、それが$result[3]数字であるかどうかを確認し、それをあなたのとして使用することができますid。このアプローチは、複数のパラメーターに簡単に拡張でき、さまざまな許容項目をチェックできます。

于 2012-12-04T20:54:02.810 に答える