2

ルート変数を受け取る必要があるように、ルート システムを構築しています。"/post/edit/some-stuff-to-check"問題は、 ("-"char )のようなものになるまで、完全に機能することです

これを見て

$pattern = 'post/edit/(\w+)';

$pattern = '/' . str_replace('/', '\/', $pattern) . '/i';

// Note, the "test" is a variable here
$uri = 'post/edit/test';

if (preg_match($pattern, $uri, $params)) {

        // It works, outputs exactly what I need

        // Array ( [0] => post/edit/test [1] => test ) Array ( ) 

        print_r($params);

}

しかし、uri に のような変数が含まれていると/post/edit/foo-bar-test、それは機能しなくなります。だから私は正規表現クラスを介して明示的に一致させようとしたので、これの代わりに:

$pattern = 'post/edit/(\w+)';

私はこれを使用しました:

$pattern = 'post/edit/[a-zA-Z0-9_-]';

しかし運がない。

問題は、文字列に含ま[A-Za-z0-9_-]れる変数を適切に一致させるにはどうすればよいかということです。URI

4

1 に答える 1

4

私はこれを使用しました:$pattern = 'post/edit/[a-zA-Z0-9_-]';

+これに伴う問題は、文字セットが 1 つの文字にしか一致しないことです。つまり、その後ろの文字がありません。

\wとはいえ、ダッシュを追加するだけで文字セットを作成することもできます。

$pattern = '~post/edit/([\w-]+)~i';

上記のパターンでは~、式の区切り記号として使用しました。これにより、エスケープせずに内部でスラッシュを使用できます。

$input = '/post/edit/some-stuff-to-check';
$pattern = '~post/edit/([\w-]+)~i';
preg_match($pattern, $input, $matches);
print_r($matches);

出力:

Array
(
    [0] => post/edit/some-stuff-to-check
    [1] => some-stuff-to-check
)
于 2013-06-17T02:34:35.293 に答える