1

私はコードイグナイターを使用していて、$routes配列を介して複数のURLセグメントをキャプチャしようとしています。

たとえば、私のURLは次のようになります。

/segment-1/segment-2/keyword/

私はこの正規表現だけを使おうとしています:

$route['([\w-?]+){1,3}'] = "my/method";

ただし、このサブグループの一致のみが返されます。

segment-1

次に、このルートを試すと:

(\/[\w-?]+){1,3}

これをサブグループの一致として返します。

/keyword

そのため、すべてのインスタンスを確実にキャプチャするために、正確なルートを明示的に設定しています。

$route['([\w-?]+)'] = 'my/method/$1';
$route['([\w-?]+)/([\w-?]+)'] = 'my/method/$1/$2';
$route['([\w-?]+)/([\w-?]+)/([\w-?]+)'] = 'my/method/$1/$2/$3';

これは明らかにかなり冗長です。最終的には、すべてのセグメントを1つの正規表現でキャプチャしたいと思います。

考え?

4

1 に答える 1

0

通常、1 つの正規表現で任意の数のキャプチャ グループを使用することは不可能です。あなた自身の試みからわかるように、1 つのキャプチャ グループを繰り返すと、最後の一致が得られます。ただし、追加の「ディレクトリ」をオプションにすることで、特定の数のパス要素まで解決できます。3 が最大であるとします。

$route['([\w-?]+)(/[\w-?]+(/[\w-?]+)?)?'] = 'my/method/$1$2$3';

(/[\w-?]+)?より深いパスを可能にするために、最後にいくつかのネストを追加できます。それ以外の場合は、ループで配列を自動的に埋めることができます$routeが、それも固定された深さまでしか機能しません。

于 2012-10-17T16:45:15.363 に答える