3

ルート システムを構築していURI segmentますが、正確に一致する変数が必要です。[A-Za-z]

変数は (先頭または末尾だけでなく) 任意の位置に配置できることに注意することが非常に重要です。

たとえば、これは

/post/(:letter)/comment/(:letter)

また

/user/(:letter)

また

/(:letter)

頼れないよう^$

問題は、期待どおりに動作しないこと===です。これは数字と文字の両方に一致するため、望ましくありません。私は文字とのみを気にします。

A-Za-zURI 変数には文字とのみを含める必要があるため、これを数字やその他のものではなく、のみに一致させたいと考えています。

実際の問題を実証するには、

$pattern = '~/post/(:letter)/commentid/(:letter)/replyid/(:letter)~';

$pattern = str_replace('(:letter)', '[A-Za-z]+', $pattern);

$uri = '/post/foo/commentid/someid/replyid/someanotherid';

preg_match($pattern, $uri, $matches);

print_r($matches); // Success

これを見てください:

$uri = '/post/foo123/commentid/someid123/replyid/someanotherid123';

preg_match($pattern, $uri, $matches);

print_r($matches); // Also success, I don't want this!

ご覧のとおり、変数 、 にも数値が含まれているため、これは望ましくあり ませfoo123ん。someid123someanotherid123

質問は、

$magic_regex = 'What should it be to match exactly [A-Za-z] at any position?';

$pattern = str_replace('(:letter)', $magic_regex, $pattern);
4

3 に答える 3

1

あなたが与える問題の例は、実際には問題ではありません。[A-Za-z]+正規表現の後に文字列が続く/ため、一致しません$pattern。おそらく最後の位置に問題があります。最後に$orのようなものを追加するだけです。([?].*)?$

于 2013-06-17T16:14:51.803 に答える
1

置換ごとに先読みアサーションを追加できます。

$pattern = str_replace('(:letter)', '[A-Za-z]+(?=/|$)', $pattern);

アサーションは、スラッシュまたは URI の末尾に一致します。

于 2013-06-17T16:03:29.160 に答える