1

アプリケーションをルーティングしていますが、ディレクトリ パスに続く最大 2 つのディレクトリ サブパスのみを許可したいと考えていますtags/。使用できる文字はハイフンとアルナムのみです。

以下はすべて検証され、以下の太字は単一の一致としてルーターに返されます。

  • タグ/焼き方
  • タグ/焼き方/クッキー

3 つ以上のサブパス (つまり、2 つ以上のスラッシュ) がある場合、ルーターはno match を返す必要があります。

私のサーバーは末尾のスラッシュで (末尾のスラッシュ以外の URL に) リダイレクトするため、考慮する必要はありません。

現在使用してtags/([\w+\-\/]+)$いますが、これにより無限に多くのサブパスが許可され、ルーターが一致を返した後、サブパスの長さ (スラッシュの数) を確認する必要があります。

私が書いた文字セットで 0 または 1 つのスラッシュのみを許可し、単語文字が続く可能性があり、それらすべてを 1 つの一致として返す方法がわかりません。

これは正規表現で可能ですか?

4

4 に答える 4

2

Barmarのソリューションはあなたの質問に完全に答えます...これは、パスの式の末尾のスラッシュを考慮した別のバージョンです:

(tags\/[-\w]+\/?(?:[-\w]+)?(?<!\/)\/?)$

regex101.com

于 2013-08-24T01:34:37.457 に答える
1

この正規表現はそれを行う必要があります:

tags/[\w\-]+(/[\w\-]+)?$

の後に 1 語tags/、その後にオプションのスラッシュと別の語を続けることができます。

文字クラス内には必要ありません+-許可されている文字はアルナムとハイフンだけだと言いました。

于 2013-08-24T01:23:26.550 に答える
0

あなたが言ったことを正確に行い、「tags/」の後に「file」または「file/file」を一致させます。ざっくり「tags/(file|file/file)$」。

于 2013-08-24T01:25:16.260 に答える
0

簡単:

^tags(?:/[\w+\-]+){1,2}$

以下は、正規表現のコメント付きバージョンを実装する、テスト済みの PHP コマンド ライン スクリプトです。

<?php // test.php Rev:20130823_2100
$text = 'tags/how-to-bake/magic_brownies';

$re =   '% # Match path having two or three path segments.
        ^          # Anchor to start of string.
        tags       # Hard code first path segment.
        (?:        # Group 1 or 2 additional segments.
          /        # Path segments separated by /
          [\w+\-]+ # Path segment is one or more [A-Za-z0-9_-].
        ){1,2}     # End group of 1 or 2 additional segments.
        $          # Anchor to end of string.
        %ix';
if (preg_match($re, $text, $matches)) {
    echo("Successful match");
} else {
    echo("No match");
}
?>
于 2013-08-24T03:16:33.483 に答える