1

URL を一致させているので、リクエストをコントローラー/ビューに接続できます。いくつかの URL には複数のオプションがあり、そのうちの 1 つだけが URL に続くものを持つことができますが、その後に続くものも必要です。名前付きグループとして利用できます。

例:

  • /admin/something #マッチ
  • /admin/something/新しい #match
  • /admin/something/new/id #失敗
  • /admin/something/edit #失敗
  • /admin/something/edit/id #match

他にも多くの可能性がありますが、例としては十分です。基本的に、URL が「new」で終わる場合は何も続くことができませんが、「edit」で終わる場合は編集するための ID も必要です。

これまで使用してきた正規表現:

^/admin/something(?:/(?P<action>new|edit(?:/(?P<id>\d{1,5}))))?$

空白を分解したバージョン:

^/admin/something(?:/
    (?P<action>
        new|        # create a new something
        edit(?:/    # edit an old something
                (?P<id>\d{1,5})    # id to edit
            )
        )
    )?    # actions on something are optional
$

ただし、URL が「/admin/something/edit/id」の場合、「アクション」グループは「edit/id」です。コントローラー内で少し文字列操作を使用して、アクションを... アクションだけに削減しましたが、前向きな先読みの方がはるかにクリーンになると思います。私はそれを機能させることができませんでした。

私が取り組んできた先読み正規表現: (「新規」には一致しますが、「編集」には一致しません [ID の有無にかかわらず])

^/admin/something(?:/(?P<action>new|edit(?=(?:/(?P<id>\d{1,5})))))?$

ヒント/提案は大歓迎です。

4

4 に答える 4

2

あなたの問題は$最後にあります。これは、正規表現が行末に一致するゼロ幅アサーションです。ただし、先読みはゼロ幅のアサーションでもあります (その id は edit に従います)。先読みと呼ばれる理由は、先読み内で一致し、その一致の先頭にスキップするためです。そのため、...edit/id で失敗しています。これは、/id が edit に続き /edit が行末であることの両方をアサートしようとしているためです。/id が edit に続くと主張しようとしているため、...edit だけでは失敗します。

考えられる解決策は 2 つあります。1 つ目は、単純に $ を取り出すことです。これは、.../edit/id/gobbledygook に一致する可能性があるため、望ましくない場合があります。2 番目の解決策は、キャプチャしたグループを再利用する正規表現言語の方法を使用することです。あなたが使用している正規表現がわからないので、私はあなたを助けることができません. P<name>名前付きキャプチャの構文がわかりません。そのために必要なものは何でも<action>グループの後に置きます。

于 2009-07-28T02:43:35.067 に答える
1
^/admin/something
(
    $               |
    /new$           |
    /edit/(\d{5})$
)
于 2009-07-28T02:48:30.580 に答える
0

非正規表現の方法、

$str = "/admin/something";
$s = explode("/",$str);
if ( end($s) == "something" || end($s) == "new" ){
    print "ok\n";
}
if ( strpos($str,"edit" )!==FALSE && is_numeric(end($s)) ){
    print "ok\n";
}
于 2009-07-28T03:57:49.000 に答える
0

私がたどり着いた答えは、上記の両方の答えの一部を使用して、スラッシュなどの余分な混乱なしに、必要なすべての値を名前付きグループに格納する先読み付きの正規表現を作成します。それは私が望むすべてに一致し、他のすべてに失敗します。完全。

^/admin/something(?:(?:/
                        (?P<action>
                            new$|
                            edit(?=/(?P<id>\d{1,5})$)
                        )
                    )|$)

どちらも 1 つの真の道を見つけるのに役立ったので、複数回答をマークできればと思います。

于 2009-07-28T03:22:46.400 に答える