1

/ fooと一致させたいのですが、/ foo /(fooは任意の文字列にすることができます)または/

私はこれらの線に沿って多くのことを試みました:

sub match :Path :Regex('^[a-z]+$')
sub match :Regex('^[a-z]+$')
sub match :Path :Args(1)

しかし、私は必要なことを達成することができません。

問題が正規表現にあるとは思わないが、引数なしでパスを処理したいので:

たとえば、/ aab / cの場合、Catalystから取得します。

[debug] "GET" request for "aab/c" from "192.168.1.100"
[debug] Path is "aab"
[debug] Arguments are "c"
4

7 に答える 7

2

ドキュメントによると、

正規表現の一致はグローバルに機能します。つまり、呼び出し元の名前空間を参照しません。

正規表現を現在の名前空間のルートでのみ一致させる場合は、代わりにLocalRegexアクションを使用してみてください。

sub match : LocalRegex('^[a-z]+$')
于 2009-04-26T02:56:53.130 に答える
2

RegexまたはLocalRegexは、リクエストを処理できる他のより具体的なアクションがない場合にのみ一致します。

sub lowermatch :Regex ('/([a-z]+)/([a-z]+)') { }/ foo / barをキャッチして適切に処理するために、サポートする必要があります。ただし、既存のスタブは「/」をキャッチするべきではありません。ルート->デフォルトに移行する必要があります

または、引数がない場合は、既存のサブで$ c-> forwardを実行できます。つまり、次のようになります。

sub match :Regex ('/foo') {
    my ($self, $c, @args) = @_;
    $c->forward('noargs_action') unless @args;
    ...
}

お役に立てば幸いです。

于 2009-04-26T06:28:27.367 に答える
2

いいえ:指定された引数は、「0以上の任意の数の引数」を意味します。これは、最初の例では、/foo/bar/foo/bar/bazが一致することを意味します。正規表現自体が一致しない正規表現の後のパス要素は、アクションの引数として食べられます。

(正規表現について話し、「Catalystはわかりませんが」と言っている人は、正規表現マッチャーの$が「/」の直前に一致する可能性があり、URLの最後にあるとは限らないという点を見逃しています。 、Catalystで。残りは引数として使用されます。)

:Args(0)0パス部分が引数として使用されることを指定して、達成しようとしていることを要求します(したがって一致/foo/bar しません)。

ただし、を使用したクイックテスト

sub match :LocalRegex('^[a-z]+$') :Args(0)

/fooと両方が一致することを示して/foo/います(ただし、これは一歩近づいています:一致/match/xyzしません)。Catalystは'/'を特別にパスで処理するため、これよりもうまくできるかどうかはわかりません。

于 2009-04-28T12:49:23.080 に答える
1

免責事項:私はCatalystに精通していません。これらは(Perl)正規表現です。

「foo」が英数字でなければならない場合、これはあなたが望むことをします:

^\/\w*$

「foo」が本当に何でもよい場合は、代わりにこれを使用してください。

^\/$|^\/.*[^\/]$
于 2009-04-25T22:51:14.033 に答える
1

LocalRegexアクションは、おそらくあなたが説明することには問題ありませんが、この種のことをしているのであれば、HTTP仕様と戦っています。

于 2009-04-26T06:30:34.070 に答える
0

私はCatalystを知りませんが、ドキュメントを読んだところ、あなたが望むように見えます

サブマッチ:Regex('^ [a-zA-Z] * $'){}

正規表現は次のように分類されます。

  • ^ルートの直後に一致(つまり/)
  • [a-zA-Z]*は0個以上のazまたはAZ文字に一致します
  • $はURLの終わりに一致します
于 2009-04-25T22:50:16.750 に答える
0

この答えはあなたが探しているものではないかもしれませんが、完全を期すためにここに入れたいと思います。おそらくModRewriteのようなものを使用して、/foo/から/fooバリアントにリダイレクトします。

于 2010-09-14T15:14:03.007 に答える